2017-12-07 20:38:26 +01:00
#!/usr/bin/env python3
2019-02-21 02:03:13 +01:00
# Copyright (c) 2017-2019 The Bitcoin Core developers
2017-12-07 20:38:26 +01:00
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
""" Test various command line arguments and configuration file parameters. """
import os
from test_framework . test_framework import BitcoinTestFramework
2018-01-02 14:57:27 +01:00
2017-12-07 20:38:26 +01:00
class ConfArgsTest ( BitcoinTestFramework ) :
def set_test_params ( self ) :
self . setup_clean_chain = True
self . num_nodes = 1
2018-09-06 11:29:40 +02:00
def test_config_file_parser ( self ) :
# Assume node is stopped
inc_conf_file_path = os . path . join ( self . nodes [ 0 ] . datadir , ' include.conf ' )
with open ( os . path . join ( self . nodes [ 0 ] . datadir , ' bitcoin.conf ' ) , ' a ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' includeconf= {} \n ' . format ( inc_conf_file_path ) )
with open ( inc_conf_file_path , ' w ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' -dash=1 \n ' )
self . nodes [ 0 ] . assert_start_raises_init_error ( expected_msg = ' Error reading configuration file: parse error on line 1: -dash=1, options in configuration file must be specified without leading - ' )
with open ( inc_conf_file_path , ' w ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' nono \n ' )
self . nodes [ 0 ] . assert_start_raises_init_error ( expected_msg = ' Error reading configuration file: parse error on line 1: nono, if you intended to specify a negated option, use nono=1 instead ' )
2018-10-16 07:19:53 +02:00
with open ( inc_conf_file_path , ' w ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' server=1 \n rpcuser=someuser \n rpcpassword=some#pass ' )
self . nodes [ 0 ] . assert_start_raises_init_error ( expected_msg = ' Error reading configuration file: parse error on line 3, using # in rpcpassword can be ambiguous and should be avoided ' )
2019-01-03 11:54:19 +01:00
with open ( inc_conf_file_path , ' w ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' server=1 \n rpcuser=someuser \n main.rpcpassword=some#pass ' )
self . nodes [ 0 ] . assert_start_raises_init_error ( expected_msg = ' Error reading configuration file: parse error on line 3, using # in rpcpassword can be ambiguous and should be avoided ' )
with open ( inc_conf_file_path , ' w ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' server=1 \n rpcuser=someuser \n [main] \n rpcpassword=some#pass ' )
self . nodes [ 0 ] . assert_start_raises_init_error ( expected_msg = ' Error reading configuration file: parse error on line 4, using # in rpcpassword can be ambiguous and should be avoided ' )
2019-02-04 04:53:19 +01:00
inc_conf_file2_path = os . path . join ( self . nodes [ 0 ] . datadir , ' include2.conf ' )
with open ( os . path . join ( self . nodes [ 0 ] . datadir , ' bitcoin.conf ' ) , ' a ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' includeconf= {} \n ' . format ( inc_conf_file2_path ) )
2018-11-12 03:06:36 +01:00
with open ( inc_conf_file_path , ' w ' , encoding = ' utf-8 ' ) as conf :
2019-02-04 04:53:19 +01:00
conf . write ( ' testnot.datadir=1 \n ' )
with open ( inc_conf_file2_path , ' w ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' [testnet] \n ' )
2018-11-12 03:06:36 +01:00
self . restart_node ( 0 )
2019-02-04 04:53:19 +01:00
self . nodes [ 0 ] . stop_node ( expected_stderr = ' Warning: ' + inc_conf_file_path + ' :1 Section [testnot] is not recognized. ' + os . linesep + ' Warning: ' + inc_conf_file2_path + ' :1 Section [testnet] is not recognized. ' )
2018-11-12 03:06:36 +01:00
2018-09-06 11:29:40 +02:00
with open ( inc_conf_file_path , ' w ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' ' ) # clear
2019-02-04 04:53:19 +01:00
with open ( inc_conf_file2_path , ' w ' , encoding = ' utf-8 ' ) as conf :
conf . write ( ' ' ) # clear
2018-09-06 11:29:40 +02:00
2017-12-07 20:38:26 +01:00
def run_test ( self ) :
self . stop_node ( 0 )
2018-09-06 11:29:40 +02:00
self . test_config_file_parser ( )
2017-12-07 20:38:26 +01:00
# Remove the -datadir argument so it doesn't override the config file
self . nodes [ 0 ] . args = [ arg for arg in self . nodes [ 0 ] . args if not arg . startswith ( " -datadir " ) ]
2018-01-02 14:57:27 +01:00
default_data_dir = self . nodes [ 0 ] . datadir
2017-12-07 20:38:26 +01:00
new_data_dir = os . path . join ( default_data_dir , ' newdatadir ' )
new_data_dir_2 = os . path . join ( default_data_dir , ' newdatadir2 ' )
# Check that using -datadir argument on non-existent directory fails
self . nodes [ 0 ] . datadir = new_data_dir
2018-03-28 15:37:09 +02:00
self . nodes [ 0 ] . assert_start_raises_init_error ( [ ' -datadir= ' + new_data_dir ] , ' Error: Specified data directory " ' + new_data_dir + ' " does not exist. ' )
2017-12-07 20:38:26 +01:00
# Check that using non-existent datadir in conf file fails
conf_file = os . path . join ( default_data_dir , " bitcoin.conf " )
2018-04-04 10:05:00 +02:00
# datadir needs to be set before [regtest] section
conf_file_contents = open ( conf_file , encoding = ' utf8 ' ) . read ( )
with open ( conf_file , ' w ' , encoding = ' utf8 ' ) as f :
2017-12-07 20:38:26 +01:00
f . write ( " datadir= " + new_data_dir + " \n " )
2018-04-04 10:05:00 +02:00
f . write ( conf_file_contents )
2018-07-17 15:14:21 +02:00
# Temporarily disabled, because this test would access the user's home dir (~/.bitcoin)
#self.nodes[0].assert_start_raises_init_error(['-conf=' + conf_file], 'Error reading configuration file: specified data directory "' + new_data_dir + '" does not exist.')
2017-12-07 20:38:26 +01:00
# Create the directory and ensure the config file now works
os . mkdir ( new_data_dir )
2018-07-17 15:14:21 +02:00
# Temporarily disabled, because this test would access the user's home dir (~/.bitcoin)
#self.start_node(0, ['-conf='+conf_file, '-wallet=w1'])
#self.stop_node(0)
2018-09-23 17:34:51 +02:00
#assert os.path.exists(os.path.join(new_data_dir, 'regtest', 'blocks'))
#if self.is_wallet_compiled():
2018-07-17 15:14:21 +02:00
#assert os.path.exists(os.path.join(new_data_dir, 'regtest', 'wallets', 'w1'))
2017-12-07 20:38:26 +01:00
# Ensure command line argument overrides datadir in conf
os . mkdir ( new_data_dir_2 )
self . nodes [ 0 ] . datadir = new_data_dir_2
self . start_node ( 0 , [ ' -datadir= ' + new_data_dir_2 , ' -conf= ' + conf_file , ' -wallet=w2 ' ] )
2018-09-23 17:34:51 +02:00
assert os . path . exists ( os . path . join ( new_data_dir_2 , ' regtest ' , ' blocks ' ) )
if self . is_wallet_compiled ( ) :
assert os . path . exists ( os . path . join ( new_data_dir_2 , ' regtest ' , ' wallets ' , ' w2 ' ) )
2017-12-07 20:38:26 +01:00
if __name__ == ' __main__ ' :
ConfArgsTest ( ) . main ( )