Skip to content

Commit fa9f495

Browse files
author
MarcoFalke
committed
test: Move get_binary_paths and Binaries to util.py
Can be reviewed with the git options --color-moved=dimmed-zebra --color-moved-ws=ignore-all-space
1 parent 40e7d4c commit fa9f495

File tree

2 files changed

+90
-87
lines changed

2 files changed

+90
-87
lines changed

test/functional/test_framework/test_framework.py

Lines changed: 3 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,25 @@
1414
import pdb
1515
import random
1616
import re
17-
import shlex
1817
import shutil
1918
import subprocess
2019
import sys
2120
import tempfile
2221
import time
23-
import types
2422

2523
from .address import create_deterministic_address_bcrt1_p2tr_op_true
2624
from .authproxy import JSONRPCException
2725
from . import coverage
2826
from .p2p import NetworkThread
2927
from .test_node import TestNode
3028
from .util import (
29+
Binaries,
3130
MAX_NODES,
3231
PortSeed,
3332
assert_equal,
3433
check_json_precision,
3534
find_vout_for_address,
35+
get_binary_paths,
3636
get_datadir_path,
3737
initialize_datadir,
3838
p2p_port,
@@ -60,63 +60,6 @@ def __init__(self, message):
6060
self.message = message
6161

6262

63-
class Binaries:
64-
"""Helper class to provide information about bitcoin binaries
65-
66-
Attributes:
67-
paths: Object returned from get_binary_paths() containing information
68-
which binaries and command lines to use from environment variables and
69-
the config file.
70-
bin_dir: An optional string containing a directory path to look for
71-
binaries, which takes precedence over the paths above, if specified.
72-
This is used by tests calling binaries from previous releases.
73-
"""
74-
def __init__(self, paths, bin_dir):
75-
self.paths = paths
76-
self.bin_dir = bin_dir
77-
78-
def node_argv(self, **kwargs):
79-
"Return argv array that should be used to invoke bitcoind"
80-
return self._argv("node", self.paths.bitcoind, **kwargs)
81-
82-
def rpc_argv(self):
83-
"Return argv array that should be used to invoke bitcoin-cli"
84-
# Add -nonamed because "bitcoin rpc" enables -named by default, but bitcoin-cli doesn't
85-
return self._argv("rpc", self.paths.bitcoincli) + ["-nonamed"]
86-
87-
def tx_argv(self):
88-
"Return argv array that should be used to invoke bitcoin-tx"
89-
return self._argv("tx", self.paths.bitcointx)
90-
91-
def util_argv(self):
92-
"Return argv array that should be used to invoke bitcoin-util"
93-
return self._argv("util", self.paths.bitcoinutil)
94-
95-
def wallet_argv(self):
96-
"Return argv array that should be used to invoke bitcoin-wallet"
97-
return self._argv("wallet", self.paths.bitcoinwallet)
98-
99-
def chainstate_argv(self):
100-
"Return argv array that should be used to invoke bitcoin-chainstate"
101-
return self._argv("chainstate", self.paths.bitcoinchainstate)
102-
103-
def _argv(self, command, bin_path, need_ipc=False):
104-
"""Return argv array that should be used to invoke the command. It
105-
either uses the bitcoin wrapper executable (if BITCOIN_CMD is set or
106-
need_ipc is True), or the direct binary path (bitcoind, etc). When
107-
bin_dir is set (by tests calling binaries from previous releases) it
108-
always uses the direct path."""
109-
if self.bin_dir is not None:
110-
return [os.path.join(self.bin_dir, os.path.basename(bin_path))]
111-
elif self.paths.bitcoin_cmd is not None or need_ipc:
112-
# If the current test needs IPC functionality, use the bitcoin
113-
# wrapper binary and append -m so it calls multiprocess binaries.
114-
bitcoin_cmd = self.paths.bitcoin_cmd or [self.paths.bitcoin_bin]
115-
return bitcoin_cmd + (["-m"] if need_ipc else []) + [command]
116-
else:
117-
return [bin_path]
118-
119-
12063
class BitcoinTestMetaClass(type):
12164
"""Metaclass for BitcoinTestFramework.
12265
@@ -270,39 +213,12 @@ def parse_args(self, test_file):
270213

271214
self.config = configparser.ConfigParser()
272215
self.config.read_file(open(self.options.configfile))
273-
self.binary_paths = self.get_binary_paths()
216+
self.binary_paths = get_binary_paths(self.config)
274217
if self.options.v1transport:
275218
self.options.v2transport=False
276219

277220
PortSeed.n = self.options.port_seed
278221

279-
def get_binary_paths(self):
280-
"""Get paths of all binaries from environment variables or their default values"""
281-
282-
paths = types.SimpleNamespace()
283-
binaries = {
284-
"bitcoin": "BITCOIN_BIN",
285-
"bitcoind": "BITCOIND",
286-
"bitcoin-cli": "BITCOINCLI",
287-
"bitcoin-util": "BITCOINUTIL",
288-
"bitcoin-tx": "BITCOINTX",
289-
"bitcoin-chainstate": "BITCOINCHAINSTATE",
290-
"bitcoin-wallet": "BITCOINWALLET",
291-
}
292-
# Set paths to bitcoin core binaries allowing overrides with environment
293-
# variables.
294-
for binary, env_variable_name in binaries.items():
295-
default_filename = os.path.join(
296-
self.config["environment"]["BUILDDIR"],
297-
"bin",
298-
binary + self.config["environment"]["EXEEXT"],
299-
)
300-
setattr(paths, env_variable_name.lower(), os.getenv(env_variable_name, default=default_filename))
301-
# BITCOIN_CMD environment variable can be specified to invoke bitcoin
302-
# wrapper binary instead of other executables.
303-
paths.bitcoin_cmd = shlex.split(os.getenv("BITCOIN_CMD", "")) or None
304-
return paths
305-
306222
def get_binaries(self, bin_dir=None):
307223
return Binaries(self.binary_paths, bin_dir)
308224

test/functional/test_framework/util.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
import platform
1717
import random
1818
import re
19+
import shlex
1920
import time
21+
import types
2022

2123
from . import coverage
2224
from .authproxy import AuthServiceProxy, JSONRPCException
@@ -235,6 +237,91 @@ def check_json_precision():
235237
raise RuntimeError("JSON encode/decode loses precision")
236238

237239

240+
class Binaries:
241+
"""Helper class to provide information about bitcoin binaries
242+
243+
Attributes:
244+
paths: Object returned from get_binary_paths() containing information
245+
which binaries and command lines to use from environment variables and
246+
the config file.
247+
bin_dir: An optional string containing a directory path to look for
248+
binaries, which takes precedence over the paths above, if specified.
249+
This is used by tests calling binaries from previous releases.
250+
"""
251+
def __init__(self, paths, bin_dir):
252+
self.paths = paths
253+
self.bin_dir = bin_dir
254+
255+
def node_argv(self, **kwargs):
256+
"Return argv array that should be used to invoke bitcoind"
257+
return self._argv("node", self.paths.bitcoind, **kwargs)
258+
259+
def rpc_argv(self):
260+
"Return argv array that should be used to invoke bitcoin-cli"
261+
# Add -nonamed because "bitcoin rpc" enables -named by default, but bitcoin-cli doesn't
262+
return self._argv("rpc", self.paths.bitcoincli) + ["-nonamed"]
263+
264+
def tx_argv(self):
265+
"Return argv array that should be used to invoke bitcoin-tx"
266+
return self._argv("tx", self.paths.bitcointx)
267+
268+
def util_argv(self):
269+
"Return argv array that should be used to invoke bitcoin-util"
270+
return self._argv("util", self.paths.bitcoinutil)
271+
272+
def wallet_argv(self):
273+
"Return argv array that should be used to invoke bitcoin-wallet"
274+
return self._argv("wallet", self.paths.bitcoinwallet)
275+
276+
def chainstate_argv(self):
277+
"Return argv array that should be used to invoke bitcoin-chainstate"
278+
return self._argv("chainstate", self.paths.bitcoinchainstate)
279+
280+
def _argv(self, command, bin_path, need_ipc=False):
281+
"""Return argv array that should be used to invoke the command. It
282+
either uses the bitcoin wrapper executable (if BITCOIN_CMD is set or
283+
need_ipc is True), or the direct binary path (bitcoind, etc). When
284+
bin_dir is set (by tests calling binaries from previous releases) it
285+
always uses the direct path."""
286+
if self.bin_dir is not None:
287+
return [os.path.join(self.bin_dir, os.path.basename(bin_path))]
288+
elif self.paths.bitcoin_cmd is not None or need_ipc:
289+
# If the current test needs IPC functionality, use the bitcoin
290+
# wrapper binary and append -m so it calls multiprocess binaries.
291+
bitcoin_cmd = self.paths.bitcoin_cmd or [self.paths.bitcoin_bin]
292+
return bitcoin_cmd + (["-m"] if need_ipc else []) + [command]
293+
else:
294+
return [bin_path]
295+
296+
297+
def get_binary_paths(config):
298+
"""Get paths of all binaries from environment variables or their default values"""
299+
300+
paths = types.SimpleNamespace()
301+
binaries = {
302+
"bitcoin": "BITCOIN_BIN",
303+
"bitcoind": "BITCOIND",
304+
"bitcoin-cli": "BITCOINCLI",
305+
"bitcoin-util": "BITCOINUTIL",
306+
"bitcoin-tx": "BITCOINTX",
307+
"bitcoin-chainstate": "BITCOINCHAINSTATE",
308+
"bitcoin-wallet": "BITCOINWALLET",
309+
}
310+
# Set paths to bitcoin core binaries allowing overrides with environment
311+
# variables.
312+
for binary, env_variable_name in binaries.items():
313+
default_filename = os.path.join(
314+
config["environment"]["BUILDDIR"],
315+
"bin",
316+
binary + config["environment"]["EXEEXT"],
317+
)
318+
setattr(paths, env_variable_name.lower(), os.getenv(env_variable_name, default=default_filename))
319+
# BITCOIN_CMD environment variable can be specified to invoke bitcoin
320+
# wrapper binary instead of other executables.
321+
paths.bitcoin_cmd = shlex.split(os.getenv("BITCOIN_CMD", "")) or None
322+
return paths
323+
324+
238325
def count_bytes(hex_string):
239326
return len(bytearray.fromhex(hex_string))
240327

0 commit comments

Comments
 (0)