Changeset View
Changeset View
Standalone View
Standalone View
test/functional/feature_config_args.py
Show All 15 Lines | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
self.supports_cli = False | self.supports_cli = False | ||||
self.wallet_names = [] | self.wallet_names = [] | ||||
self.disable_autoconnect = False | self.disable_autoconnect = False | ||||
def test_config_file_parser(self): | def test_config_file_parser(self): | ||||
self.stop_node(0) | self.stop_node(0) | ||||
inc_conf_file_path = os.path.join( | inc_conf_file_path = os.path.join(self.nodes[0].datadir, "include.conf") | ||||
self.nodes[0].datadir, 'include.conf') | with open( | ||||
with open(os.path.join(self.nodes[0].datadir, 'bitcoin.conf'), 'a', encoding='utf-8') as conf: | os.path.join(self.nodes[0].datadir, "bitcoin.conf"), "a", encoding="utf-8" | ||||
conf.write(f'includeconf={inc_conf_file_path}\n') | ) as conf: | ||||
conf.write(f"includeconf={inc_conf_file_path}\n") | |||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg='Error: Error parsing command line arguments: Invalid parameter -dash_cli=1', | expected_msg=( | ||||
extra_args=['-dash_cli=1'], | "Error: Error parsing command line arguments: Invalid parameter" | ||||
) | " -dash_cli=1" | ||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf: | ), | ||||
conf.write('dash_conf=1\n') | extra_args=["-dash_cli=1"], | ||||
with self.nodes[0].assert_debug_log(expected_msgs=['Ignoring unknown configuration value dash_conf']): | ) | ||||
with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | |||||
conf.write("dash_conf=1\n") | |||||
with self.nodes[0].assert_debug_log( | |||||
expected_msgs=["Ignoring unknown configuration value dash_conf"] | |||||
): | |||||
self.start_node(0) | self.start_node(0) | ||||
self.stop_node(0) | self.stop_node(0) | ||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf: | with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | ||||
conf.write('-dash=1\n') | conf.write("-dash=1\n") | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg='Error: Error reading configuration file: parse error on line 1: -dash=1, options in configuration file must be specified without leading -') | expected_msg=( | ||||
"Error: Error reading configuration file: parse error on line 1:" | |||||
" -dash=1, options in configuration file must be specified without" | |||||
" leading -" | |||||
) | |||||
) | |||||
if self.is_wallet_compiled(): | if self.is_wallet_compiled(): | ||||
with open(inc_conf_file_path, 'w', encoding='utf8') as conf: | with open(inc_conf_file_path, "w", encoding="utf8") as conf: | ||||
conf.write("wallet=foo\n") | conf.write("wallet=foo\n") | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg=f'Error: Config setting for -wallet only applied on {self.chain} network when in [{self.chain}] section.') | expected_msg=( | ||||
"Error: Config setting for -wallet only applied on" | |||||
f" {self.chain} network when in [{self.chain}] section." | |||||
) | |||||
) | |||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf: | with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | ||||
conf.write('regtest=0\n') # mainnet | conf.write("regtest=0\n") # mainnet | ||||
conf.write('acceptnonstdtxn=1\n') | conf.write("acceptnonstdtxn=1\n") | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg='Error: acceptnonstdtxn is not currently supported for main chain') | expected_msg=( | ||||
"Error: acceptnonstdtxn is not currently supported for main chain" | |||||
) | |||||
) | |||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf: | with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | ||||
conf.write('nono\n') | conf.write("nono\n") | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg='Error: Error reading configuration file: parse error on line 1: nono, if you intended to specify a negated option, use nono=1 instead') | expected_msg=( | ||||
"Error: Error reading configuration file: parse error on line 1: nono," | |||||
" if you intended to specify a negated option, use nono=1 instead" | |||||
) | |||||
) | |||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf: | with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | ||||
conf.write('server=1\nrpcuser=someuser\nrpcpassword=some#pass') | conf.write("server=1\nrpcuser=someuser\nrpcpassword=some#pass") | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg='Error: Error reading configuration file: parse error on line 3, using # in rpcpassword can be ambiguous and should be avoided') | expected_msg=( | ||||
"Error: 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: | with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | ||||
conf.write('server=1\nrpcuser=someuser\nmain.rpcpassword=some#pass') | conf.write("server=1\nrpcuser=someuser\nmain.rpcpassword=some#pass") | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg='Error: Error reading configuration file: parse error on line 3, using # in rpcpassword can be ambiguous and should be avoided') | expected_msg=( | ||||
"Error: 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: | with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | ||||
conf.write( | conf.write("server=1\nrpcuser=someuser\n[main]\nrpcpassword=some#pass") | ||||
'server=1\nrpcuser=someuser\n[main]\nrpcpassword=some#pass') | |||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg='Error: Error reading configuration file: parse error on line 4, using # in rpcpassword can be ambiguous and should be avoided') | expected_msg=( | ||||
"Error: Error reading configuration file: parse error on line 4, using" | |||||
inc_conf_file2_path = os.path.join( | " # in rpcpassword can be ambiguous and should be avoided" | ||||
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(f'includeconf={inc_conf_file2_path}\n') | |||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf: | inc_conf_file2_path = os.path.join(self.nodes[0].datadir, "include2.conf") | ||||
conf.write('testnot.datadir=1\n') | with open( | ||||
with open(inc_conf_file2_path, 'w', encoding='utf-8') as conf: | os.path.join(self.nodes[0].datadir, "bitcoin.conf"), "a", encoding="utf-8" | ||||
conf.write('[testnet]\n') | ) as conf: | ||||
conf.write(f"includeconf={inc_conf_file2_path}\n") | |||||
with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | |||||
conf.write("testnot.datadir=1\n") | |||||
with open(inc_conf_file2_path, "w", encoding="utf-8") as conf: | |||||
conf.write("[testnet]\n") | |||||
self.restart_node(0) | self.restart_node(0) | ||||
self.nodes[0].stop_node( | self.nodes[0].stop_node( | ||||
expected_stderr='Warning: ' + | expected_stderr="Warning: " | ||||
inc_conf_file_path + | + inc_conf_file_path | ||||
':1 Section [testnot] is not recognized.' + | + ":1 Section [testnot] is not recognized." | ||||
os.linesep + | + os.linesep | ||||
inc_conf_file2_path + | + inc_conf_file2_path | ||||
':1 Section [testnet] is not recognized.') | + ":1 Section [testnet] is not recognized." | ||||
) | |||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf: | |||||
conf.write('') # clear | with open(inc_conf_file_path, "w", encoding="utf-8") as conf: | ||||
with open(inc_conf_file2_path, 'w', encoding='utf-8') as conf: | conf.write("") # clear | ||||
conf.write('') # clear | with open(inc_conf_file2_path, "w", encoding="utf-8") as conf: | ||||
conf.write("") # clear | |||||
def test_invalid_command_line_options(self): | def test_invalid_command_line_options(self): | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
expected_msg='Error: No proxy server specified. Use -proxy=<ip> or ' | expected_msg=( | ||||
'-proxy=<ip:port>.', | "Error: No proxy server specified. Use -proxy=<ip> or -proxy=<ip:port>." | ||||
extra_args=['-proxy'], | ), | ||||
extra_args=["-proxy"], | |||||
) | ) | ||||
def test_log_buffer(self): | def test_log_buffer(self): | ||||
self.stop_node(0) | self.stop_node(0) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=['Warning: parsed potentially confusing double-negative -connect=0\n']): | with self.nodes[0].assert_debug_log( | ||||
self.start_node(0, extra_args=['-noconnect=0']) | expected_msgs=[ | ||||
"Warning: parsed potentially confusing double-negative -connect=0\n" | |||||
] | |||||
): | |||||
self.start_node(0, extra_args=["-noconnect=0"]) | |||||
def test_args_log(self): | def test_args_log(self): | ||||
self.stop_node(0) | self.stop_node(0) | ||||
self.log.info('Test config args logging') | self.log.info("Test config args logging") | ||||
with self.nodes[0].assert_debug_log( | with self.nodes[0].assert_debug_log( | ||||
expected_msgs=[ | expected_msgs=[ | ||||
'Command-line arg: addnode="some.node"', | 'Command-line arg: addnode="some.node"', | ||||
'Command-line arg: rpcauth=****', | "Command-line arg: rpcauth=****", | ||||
'Command-line arg: rpcbind=****', | "Command-line arg: rpcbind=****", | ||||
'Command-line arg: rpcpassword=****', | "Command-line arg: rpcpassword=****", | ||||
'Command-line arg: rpcuser=****', | "Command-line arg: rpcuser=****", | ||||
'Command-line arg: torpassword=****', | "Command-line arg: torpassword=****", | ||||
f'Config file arg: {self.chain}="1"', | f'Config file arg: {self.chain}="1"', | ||||
f'Config file arg: [{self.chain}] server="1"', | f'Config file arg: [{self.chain}] server="1"', | ||||
], | ], | ||||
unexpected_msgs=[ | unexpected_msgs=[ | ||||
'alice:f7efda5c189b999524f151318c0c86$d5b51b3beffbc0', | "alice:f7efda5c189b999524f151318c0c86$d5b51b3beffbc0", | ||||
'127.1.1.1', | "127.1.1.1", | ||||
'secret-rpcuser', | "secret-rpcuser", | ||||
'secret-torpassword', | "secret-torpassword", | ||||
]): | ], | ||||
self.start_node(0, extra_args=[ | ): | ||||
'-addnode=some.node', | self.start_node( | ||||
'-rpcauth=alice:f7efda5c189b999524f151318c0c86$d5b51b3beffbc0', | 0, | ||||
'-rpcbind=127.1.1.1', | extra_args=[ | ||||
'-rpcpassword=', | "-addnode=some.node", | ||||
'-rpcuser=secret-rpcuser', | "-rpcauth=alice:f7efda5c189b999524f151318c0c86$d5b51b3beffbc0", | ||||
'-torpassword=secret-torpassword', | "-rpcbind=127.1.1.1", | ||||
]) | "-rpcpassword=", | ||||
"-rpcuser=secret-rpcuser", | |||||
"-torpassword=secret-torpassword", | |||||
], | |||||
) | |||||
def test_networkactive(self): | def test_networkactive(self): | ||||
self.log.info('Test -networkactive option') | self.log.info("Test -networkactive option") | ||||
self.stop_node(0) | self.stop_node(0) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=['SetNetworkActive: true\n']): | with self.nodes[0].assert_debug_log(expected_msgs=["SetNetworkActive: true\n"]): | ||||
self.start_node(0) | self.start_node(0) | ||||
self.stop_node(0) | self.stop_node(0) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=['SetNetworkActive: true\n']): | with self.nodes[0].assert_debug_log(expected_msgs=["SetNetworkActive: true\n"]): | ||||
self.start_node(0, extra_args=['-networkactive']) | self.start_node(0, extra_args=["-networkactive"]) | ||||
self.stop_node(0) | self.stop_node(0) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=['SetNetworkActive: true\n']): | with self.nodes[0].assert_debug_log(expected_msgs=["SetNetworkActive: true\n"]): | ||||
self.start_node(0, extra_args=['-networkactive=1']) | self.start_node(0, extra_args=["-networkactive=1"]) | ||||
self.stop_node(0) | self.stop_node(0) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=['SetNetworkActive: false\n']): | with self.nodes[0].assert_debug_log( | ||||
self.start_node(0, extra_args=['-networkactive=0']) | expected_msgs=["SetNetworkActive: false\n"] | ||||
): | |||||
self.start_node(0, extra_args=["-networkactive=0"]) | |||||
self.stop_node(0) | self.stop_node(0) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=['SetNetworkActive: false\n']): | with self.nodes[0].assert_debug_log( | ||||
self.start_node(0, extra_args=['-nonetworkactive']) | expected_msgs=["SetNetworkActive: false\n"] | ||||
): | |||||
self.start_node(0, extra_args=["-nonetworkactive"]) | |||||
self.stop_node(0) | self.stop_node(0) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=['SetNetworkActive: false\n']): | with self.nodes[0].assert_debug_log( | ||||
self.start_node(0, extra_args=['-nonetworkactive=1']) | expected_msgs=["SetNetworkActive: false\n"] | ||||
): | |||||
self.start_node(0, extra_args=["-nonetworkactive=1"]) | |||||
def test_seed_peers(self): | def test_seed_peers(self): | ||||
self.log.info('Test seed peers') | self.log.info("Test seed peers") | ||||
default_data_dir = self.nodes[0].datadir | default_data_dir = self.nodes[0].datadir | ||||
# Only regtest has no fixed seeds. To avoid connections to random | # Only regtest has no fixed seeds. To avoid connections to random | ||||
# nodes, regtest is the only network where it is safe to enable | # nodes, regtest is the only network where it is safe to enable | ||||
# -fixedseeds in tests | # -fixedseeds in tests | ||||
assert_equal(self.nodes[0].getblockchaininfo()['chain'], 'regtest') | assert_equal(self.nodes[0].getblockchaininfo()["chain"], "regtest") | ||||
self.stop_node(0) | self.stop_node(0) | ||||
# No peers.dat exists and -dnsseed=1 | # No peers.dat exists and -dnsseed=1 | ||||
# We expect the node will use DNS Seeds, but Regtest mode has 0 DNS seeds | # We expect the node will use DNS Seeds, but Regtest mode has 0 DNS seeds | ||||
# So after 60 seconds, the node should fallback to fixed seeds (this is | # So after 60 seconds, the node should fallback to fixed seeds (this is | ||||
# a slow test) | # a slow test) | ||||
assert not os.path.exists(os.path.join(default_data_dir, "peers.dat")) | assert not os.path.exists(os.path.join(default_data_dir, "peers.dat")) | ||||
start = int(time.time()) | start = int(time.time()) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=[ | with self.nodes[0].assert_debug_log( | ||||
expected_msgs=[ | |||||
"Loaded 0 addresses from peers.dat", | "Loaded 0 addresses from peers.dat", | ||||
"0 addresses found from DNS seeds", | "0 addresses found from DNS seeds", | ||||
], timeout=10): | ], | ||||
timeout=10, | |||||
): | |||||
self.start_node( | self.start_node( | ||||
0, | 0, extra_args=["-dnsseed=1", "-fixedseeds=1", f"-mocktime={start}"] | ||||
extra_args=[ | ) | ||||
'-dnsseed=1', | with self.nodes[0].assert_debug_log( | ||||
'-fixedseeds=1', | expected_msgs=[ | ||||
f'-mocktime={start}']) | |||||
with self.nodes[0].assert_debug_log(expected_msgs=[ | |||||
"Adding fixed seeds as 60 seconds have passed and addrman is empty", | "Adding fixed seeds as 60 seconds have passed and addrman is empty", | ||||
]): | ] | ||||
): | |||||
self.nodes[0].setmocktime(start + 65) | self.nodes[0].setmocktime(start + 65) | ||||
self.stop_node(0) | self.stop_node(0) | ||||
# No peers.dat exists and -dnsseed=0 | # No peers.dat exists and -dnsseed=0 | ||||
# We expect the node will fallback immediately to fixed seeds | # We expect the node will fallback immediately to fixed seeds | ||||
assert not os.path.exists(os.path.join(default_data_dir, "peers.dat")) | assert not os.path.exists(os.path.join(default_data_dir, "peers.dat")) | ||||
start = time.time() | start = time.time() | ||||
with self.nodes[0].assert_debug_log(expected_msgs=[ | with self.nodes[0].assert_debug_log( | ||||
expected_msgs=[ | |||||
"Loaded 0 addresses from peers.dat", | "Loaded 0 addresses from peers.dat", | ||||
"DNS seeding disabled", | "DNS seeding disabled", | ||||
"Adding fixed seeds as -dnsseed=0, -addnode is not provided and all -seednode(s) attempted\n", | ( | ||||
], timeout=10): | "Adding fixed seeds as -dnsseed=0, -addnode is not provided and all" | ||||
self.start_node(0, extra_args=['-dnsseed=0', '-fixedseeds=1']) | " -seednode(s) attempted\n" | ||||
), | |||||
], | |||||
timeout=10, | |||||
): | |||||
self.start_node(0, extra_args=["-dnsseed=0", "-fixedseeds=1"]) | |||||
assert time.time() - start < 60 | assert time.time() - start < 60 | ||||
self.stop_node(0) | self.stop_node(0) | ||||
# No peers.dat exists and dns seeds are disabled. | # No peers.dat exists and dns seeds are disabled. | ||||
# We expect the node will not add fixed seeds when explicitly disabled. | # We expect the node will not add fixed seeds when explicitly disabled. | ||||
assert not os.path.exists(os.path.join(default_data_dir, "peers.dat")) | assert not os.path.exists(os.path.join(default_data_dir, "peers.dat")) | ||||
start = time.time() | start = time.time() | ||||
with self.nodes[0].assert_debug_log(expected_msgs=[ | with self.nodes[0].assert_debug_log( | ||||
expected_msgs=[ | |||||
"Loaded 0 addresses from peers.dat", | "Loaded 0 addresses from peers.dat", | ||||
"DNS seeding disabled", | "DNS seeding disabled", | ||||
"Fixed seeds are disabled", | "Fixed seeds are disabled", | ||||
], timeout=10): | ], | ||||
self.start_node(0, extra_args=['-dnsseed=0', '-fixedseeds=0']) | timeout=10, | ||||
): | |||||
self.start_node(0, extra_args=["-dnsseed=0", "-fixedseeds=0"]) | |||||
assert time.time() - start < 60 | assert time.time() - start < 60 | ||||
self.stop_node(0) | self.stop_node(0) | ||||
# No peers.dat exists and -dnsseed=0, but a -addnode is provided | # No peers.dat exists and -dnsseed=0, but a -addnode is provided | ||||
# We expect the node will allow 60 seconds prior to using fixed seeds | # We expect the node will allow 60 seconds prior to using fixed seeds | ||||
assert not os.path.exists(os.path.join(default_data_dir, "peers.dat")) | assert not os.path.exists(os.path.join(default_data_dir, "peers.dat")) | ||||
start = int(time.time()) | start = int(time.time()) | ||||
with self.nodes[0].assert_debug_log(expected_msgs=[ | with self.nodes[0].assert_debug_log( | ||||
expected_msgs=[ | |||||
"Loaded 0 addresses from peers.dat", | "Loaded 0 addresses from peers.dat", | ||||
"DNS seeding disabled", | "DNS seeding disabled", | ||||
], timeout=10): | ], | ||||
timeout=10, | |||||
): | |||||
self.start_node( | self.start_node( | ||||
0, | 0, | ||||
extra_args=[ | extra_args=[ | ||||
'-dnsseed=0', | "-dnsseed=0", | ||||
'-fixedseeds=1', | "-fixedseeds=1", | ||||
'-addnode=fakenodeaddr', | "-addnode=fakenodeaddr", | ||||
f'-mocktime={start}']) | f"-mocktime={start}", | ||||
with self.nodes[0].assert_debug_log(expected_msgs=[ | ], | ||||
) | |||||
with self.nodes[0].assert_debug_log( | |||||
expected_msgs=[ | |||||
"Adding fixed seeds as 60 seconds have passed and addrman is empty", | "Adding fixed seeds as 60 seconds have passed and addrman is empty", | ||||
]): | ] | ||||
): | |||||
self.nodes[0].setmocktime(start + 65) | self.nodes[0].setmocktime(start + 65) | ||||
def run_test(self): | def run_test(self): | ||||
self.test_log_buffer() | self.test_log_buffer() | ||||
self.test_args_log() | self.test_args_log() | ||||
self.test_seed_peers() | self.test_seed_peers() | ||||
self.test_networkactive() | self.test_networkactive() | ||||
self.test_config_file_parser() | self.test_config_file_parser() | ||||
self.test_invalid_command_line_options() | self.test_invalid_command_line_options() | ||||
# Remove the -datadir argument so it doesn't override the config file | # Remove the -datadir argument so it doesn't override the config file | ||||
self.nodes[0].remove_default_args(["-datadir"]) | self.nodes[0].remove_default_args(["-datadir"]) | ||||
default_data_dir = self.nodes[0].datadir | default_data_dir = self.nodes[0].datadir | ||||
new_data_dir = os.path.join(default_data_dir, 'newdatadir') | new_data_dir = os.path.join(default_data_dir, "newdatadir") | ||||
new_data_dir_2 = os.path.join(default_data_dir, 'newdatadir2') | new_data_dir_2 = os.path.join(default_data_dir, "newdatadir2") | ||||
# Check that using -datadir argument on non-existent directory fails | # Check that using -datadir argument on non-existent directory fails | ||||
self.nodes[0].datadir = new_data_dir | self.nodes[0].datadir = new_data_dir | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
[f'-datadir={new_data_dir}'], | [f"-datadir={new_data_dir}"], | ||||
f'Error: Specified data directory "{new_data_dir}" does not exist.') | f'Error: Specified data directory "{new_data_dir}" does not exist.', | ||||
) | |||||
# Check that using non-existent datadir in conf file fails | # Check that using non-existent datadir in conf file fails | ||||
conf_file = os.path.join(default_data_dir, "bitcoin.conf") | conf_file = os.path.join(default_data_dir, "bitcoin.conf") | ||||
# datadir needs to be set before [chain] section | # datadir needs to be set before [chain] section | ||||
conf_file_contents = open(conf_file, encoding='utf8').read() | conf_file_contents = open(conf_file, encoding="utf8").read() | ||||
with open(conf_file, 'w', encoding='utf8') as f: | with open(conf_file, "w", encoding="utf8") as f: | ||||
f.write(f"datadir={new_data_dir}\n") | f.write(f"datadir={new_data_dir}\n") | ||||
f.write(conf_file_contents) | f.write(conf_file_contents) | ||||
self.nodes[0].assert_start_raises_init_error( | self.nodes[0].assert_start_raises_init_error( | ||||
[f'-conf={conf_file}'], | [f"-conf={conf_file}"], | ||||
f'Error: Error reading configuration file: specified data directory "{new_data_dir}" does not exist.') | ( | ||||
"Error: Error reading configuration file: specified data directory" | |||||
f' "{new_data_dir}" does not exist.' | |||||
), | |||||
) | |||||
# Create the directory and ensure the config file now works | # Create the directory and ensure the config file now works | ||||
os.mkdir(new_data_dir) | os.mkdir(new_data_dir) | ||||
self.start_node(0, [f'-conf={conf_file}', '-wallet=w1']) | self.start_node(0, [f"-conf={conf_file}", "-wallet=w1"]) | ||||
self.stop_node(0) | self.stop_node(0) | ||||
assert os.path.exists(os.path.join(new_data_dir, self.chain, 'blocks')) | assert os.path.exists(os.path.join(new_data_dir, self.chain, "blocks")) | ||||
if self.is_wallet_compiled(): | if self.is_wallet_compiled(): | ||||
assert os.path.exists(os.path.join( | assert os.path.exists( | ||||
new_data_dir, self.chain, 'wallets', 'w1')) | os.path.join(new_data_dir, self.chain, "wallets", "w1") | ||||
) | |||||
# Ensure command line argument overrides datadir in conf | # Ensure command line argument overrides datadir in conf | ||||
os.mkdir(new_data_dir_2) | os.mkdir(new_data_dir_2) | ||||
self.nodes[0].datadir = new_data_dir_2 | self.nodes[0].datadir = new_data_dir_2 | ||||
self.start_node(0, [f'-datadir={new_data_dir_2}', | self.start_node( | ||||
f'-conf={conf_file}', '-wallet=w2']) | 0, [f"-datadir={new_data_dir_2}", f"-conf={conf_file}", "-wallet=w2"] | ||||
assert os.path.exists( | ) | ||||
os.path.join( | assert os.path.exists(os.path.join(new_data_dir_2, self.chain, "blocks")) | ||||
new_data_dir_2, | |||||
self.chain, | |||||
'blocks')) | |||||
if self.is_wallet_compiled(): | if self.is_wallet_compiled(): | ||||
assert os.path.exists( | assert os.path.exists( | ||||
os.path.join( | os.path.join(new_data_dir_2, self.chain, "wallets", "w2") | ||||
new_data_dir_2, | ) | ||||
self.chain, | |||||
'wallets', | |||||
'w2')) | |||||
if __name__ == '__main__': | if __name__ == "__main__": | ||||
ConfArgsTest().main() | ConfArgsTest().main() |