|
13 | 13 | import pdb |
14 | 14 | import random |
15 | 15 | import re |
| 16 | +import shlex |
16 | 17 | import shutil |
17 | 18 | import subprocess |
18 | 19 | import sys |
@@ -72,33 +73,37 @@ def __init__(self, paths, bin_dir): |
72 | 73 | self.paths = paths |
73 | 74 | self.bin_dir = bin_dir |
74 | 75 |
|
75 | | - def daemon_argv(self): |
| 76 | + def node_argv(self): |
76 | 77 | "Return argv array that should be used to invoke bitcoind" |
77 | | - return self._argv(self.paths.bitcoind) |
| 78 | + return self._argv("node", self.paths.bitcoind) |
78 | 79 |
|
79 | 80 | def rpc_argv(self): |
80 | 81 | "Return argv array that should be used to invoke bitcoin-cli" |
81 | | - return self._argv(self.paths.bitcoincli) |
| 82 | + # Add -nonamed because "bitcoin rpc" enables -named by default, but bitcoin-cli doesn't |
| 83 | + return self._argv("rpc", self.paths.bitcoincli) + ["-nonamed"] |
82 | 84 |
|
83 | 85 | def util_argv(self): |
84 | 86 | "Return argv array that should be used to invoke bitcoin-util" |
85 | | - return self._argv(self.paths.bitcoinutil) |
| 87 | + return self._argv("util", self.paths.bitcoinutil) |
86 | 88 |
|
87 | 89 | def wallet_argv(self): |
88 | 90 | "Return argv array that should be used to invoke bitcoin-wallet" |
89 | | - return self._argv(self.paths.bitcoinwallet) |
| 91 | + return self._argv("wallet", self.paths.bitcoinwallet) |
90 | 92 |
|
91 | 93 | def chainstate_argv(self): |
92 | 94 | "Return argv array that should be used to invoke bitcoin-chainstate" |
93 | | - return self._argv(self.paths.bitcoinchainstate) |
94 | | - |
95 | | - def _argv(self, bin_path): |
96 | | - """Return argv array that should be used to invoke the command. |
97 | | - Normally this will return binary paths directly from the paths object, |
98 | | - but when bin_dir is set (by tests calling binaries from previous |
99 | | - releases) it will return paths relative to bin_dir instead.""" |
| 95 | + return self._argv("chainstate", self.paths.bitcoinchainstate) |
| 96 | + |
| 97 | + def _argv(self, command, bin_path): |
| 98 | + """Return argv array that should be used to invoke the command. It |
| 99 | + either uses the bitcoin wrapper executable (if BITCOIN_CMD is set), or |
| 100 | + the direct binary path (bitcoind, etc). When bin_dir is set (by tests |
| 101 | + calling binaries from previous releases) it always uses the direct |
| 102 | + path.""" |
100 | 103 | if self.bin_dir is not None: |
101 | 104 | return [os.path.join(self.bin_dir, os.path.basename(bin_path))] |
| 105 | + elif self.paths.bitcoin_cmd is not None: |
| 106 | + return self.paths.bitcoin_cmd + [command] |
102 | 107 | else: |
103 | 108 | return [bin_path] |
104 | 109 |
|
@@ -292,6 +297,9 @@ def get_binary_paths(self): |
292 | 297 | binary + self.config["environment"]["EXEEXT"], |
293 | 298 | ) |
294 | 299 | setattr(paths, attribute_name, os.getenv(env_variable_name, default=default_filename)) |
| 300 | + # BITCOIN_CMD environment variable can be specified to invoke bitcoin |
| 301 | + # wrapper binary instead of other executables. |
| 302 | + paths.bitcoin_cmd = shlex.split(os.getenv("BITCOIN_CMD", "")) or None |
295 | 303 | return paths |
296 | 304 |
|
297 | 305 | def get_binaries(self, bin_dir=None): |
@@ -537,7 +545,7 @@ def bin_dir_from_version(version): |
537 | 545 | bins_missing = False |
538 | 546 | for bin_path in (argv[0] for bin_dir in bin_dirs |
539 | 547 | for binaries in (self.get_binaries(bin_dir),) |
540 | | - for argv in (binaries.daemon_argv(), binaries.rpc_argv())): |
| 548 | + for argv in (binaries.node_argv(), binaries.rpc_argv())): |
541 | 549 | if shutil.which(bin_path) is None: |
542 | 550 | self.log.error(f"Binary not found: {bin_path}") |
543 | 551 | bins_missing = True |
|
0 commit comments