|
10 | 10 | import http.client
|
11 | 11 | import json
|
12 | 12 | import logging
|
| 13 | +import os |
13 | 14 | import re
|
14 | 15 | import subprocess
|
15 | 16 | import tempfile
|
@@ -55,17 +56,18 @@ class TestNode():
|
55 | 56 | To make things easier for the test writer, any unrecognised messages will
|
56 | 57 | be dispatched to the RPC connection."""
|
57 | 58 |
|
58 |
| - def __init__(self, i, datadir, rpchost, timewait, bitcoind, bitcoin_cli, stderr, mocktime, coverage_dir, extra_conf=None, extra_args=None, use_cli=False): |
| 59 | + def __init__(self, i, datadir, rpchost, timewait, bitcoind, bitcoin_cli, mocktime, coverage_dir, extra_conf=None, extra_args=None, use_cli=False): |
59 | 60 | self.index = i
|
60 | 61 | self.datadir = datadir
|
| 62 | + self.stdout_dir = os.path.join(self.datadir, "stdout") |
| 63 | + self.stderr_dir = os.path.join(self.datadir, "stderr") |
61 | 64 | self.rpchost = rpchost
|
62 | 65 | if timewait:
|
63 | 66 | self.rpc_timeout = timewait
|
64 | 67 | else:
|
65 | 68 | # Wait for up to 60 seconds for the RPC server to respond
|
66 | 69 | self.rpc_timeout = 60
|
67 | 70 | self.binary = bitcoind
|
68 |
| - self.stderr = stderr |
69 | 71 | self.coverage_dir = coverage_dir
|
70 | 72 | if extra_conf != None:
|
71 | 73 | append_config(datadir, extra_conf)
|
@@ -124,17 +126,24 @@ def __getattr__(self, name):
|
124 | 126 | assert self.rpc_connected and self.rpc is not None, self._node_msg("Error: no RPC connection")
|
125 | 127 | return getattr(self.rpc, name)
|
126 | 128 |
|
127 |
| - def start(self, extra_args=None, stderr=None, *args, **kwargs): |
| 129 | + def start(self, extra_args=None, stdout=None, stderr=None, *args, **kwargs): |
128 | 130 | """Start the node."""
|
129 | 131 | if extra_args is None:
|
130 | 132 | extra_args = self.extra_args
|
| 133 | + |
| 134 | + # Add a new stdout and stderr file each time bitcoind is started |
131 | 135 | if stderr is None:
|
132 |
| - stderr = self.stderr |
| 136 | + stderr = tempfile.NamedTemporaryFile(dir=self.stderr_dir, delete=False) |
| 137 | + if stdout is None: |
| 138 | + stdout = tempfile.NamedTemporaryFile(dir=self.stdout_dir, delete=False) |
| 139 | + self.stderr = stderr |
| 140 | + self.stdout = stdout |
| 141 | + |
133 | 142 | # Delete any existing cookie file -- if such a file exists (eg due to
|
134 | 143 | # unclean shutdown), it will get overwritten anyway by bitcoind, and
|
135 | 144 | # potentially interfere with our attempt to authenticate
|
136 | 145 | delete_cookie_file(self.datadir)
|
137 |
| - self.process = subprocess.Popen(self.args + extra_args, stderr=stderr, *args, **kwargs) |
| 146 | + self.process = subprocess.Popen(self.args + extra_args, stdout=stdout, stderr=stderr, *args, **kwargs) |
138 | 147 | self.running = True
|
139 | 148 | self.log.debug("bitcoind started, waiting for RPC to come up")
|
140 | 149 |
|
@@ -217,9 +226,10 @@ def assert_start_raises_init_error(self, extra_args=None, expected_msg=None, mat
|
217 | 226 |
|
218 | 227 | Will throw if bitcoind starts without an error.
|
219 | 228 | Will throw if an expected_msg is provided and it does not match bitcoind's stdout."""
|
220 |
| - with tempfile.SpooledTemporaryFile(max_size=2**16) as log_stderr: |
| 229 | + with tempfile.NamedTemporaryFile(dir=self.stderr_dir, delete=False) as log_stderr, \ |
| 230 | + tempfile.NamedTemporaryFile(dir=self.stdout_dir, delete=False) as log_stdout: |
221 | 231 | try:
|
222 |
| - self.start(extra_args, stderr=log_stderr, *args, **kwargs) |
| 232 | + self.start(extra_args, stdout=log_stdout, stderr=log_stderr, *args, **kwargs) |
223 | 233 | self.wait_for_rpc_connection()
|
224 | 234 | self.stop_node()
|
225 | 235 | self.wait_until_stopped()
|
|
0 commit comments