diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py index 1cbadf01534..921f12d9fb4 100755 --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -171,8 +171,6 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass): parser = argparse.ArgumentParser(usage="%(prog)s [options]") parser.add_argument("--nocleanup", dest="nocleanup", default=False, action="store_true", help="Leave bitcoinds and test.* datadir on exit or error") - parser.add_argument("--noshutdown", dest="noshutdown", default=False, action="store_true", - help="Don't stop bitcoinds after the test execution") parser.add_argument("--cachedir", dest="cachedir", default=os.path.abspath(os.path.dirname(test_file) + "/../cache"), help="Directory for caching pregenerated datadirs (default: %(default)s)") parser.add_argument("--tmpdir", dest="tmpdir", help="Root directory for datadirs (must not exist)") @@ -325,18 +323,15 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass): self.log.debug('Closing down network thread') self.network_thread.close() - if not self.options.noshutdown: + if self.success == TestStatus.FAILED: + self.log.info("Not stopping nodes as test failed. The dangling processes will be cleaned up later.") + else: self.log.info("Stopping nodes") if self.nodes: self.stop_nodes() - else: - for node in self.nodes: - node.cleanup_on_exit = False - self.log.info("Note: bitcoinds were not stopped and may still be running") should_clean_up = ( not self.options.nocleanup and - not self.options.noshutdown and self.success != TestStatus.FAILED and not self.options.perf ) @@ -584,15 +579,10 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass): if extra_args is None: extra_args = [None] * self.num_nodes assert_equal(len(extra_args), self.num_nodes) - try: - for i, node in enumerate(self.nodes): - node.start(extra_args[i], *args, **kwargs) - for node in self.nodes: - node.wait_for_rpc_connection() - except Exception: - # If one node failed to start, stop the others - self.stop_nodes() - raise + for i, node in enumerate(self.nodes): + node.start(extra_args[i], *args, **kwargs) + for node in self.nodes: + node.wait_for_rpc_connection() if self.options.coveragedir is not None: for node in self.nodes: diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py index d67b5bc7a53..f7d6ba78d23 100755 --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -20,6 +20,7 @@ import time import urllib.parse import collections import shlex +import sys from pathlib import Path from .authproxy import ( @@ -158,7 +159,6 @@ class TestNode(): self.rpc = None self.url = None self.log = logging.getLogger('TestFramework.node%d' % i) - self.cleanup_on_exit = True # Whether to kill the node when this object goes away # Cache perf subprocesses here by their data output filename. self.perf_subprocesses = {} @@ -200,11 +200,11 @@ class TestNode(): def __del__(self): # Ensure that we don't leave any bitcoind processes lying around after # the test ends - if self.process and self.cleanup_on_exit: + if self.process: # Should only happen on test failure # Avoid using logger, as that may have already been shutdown when # this destructor is called. - print(self._node_msg("Cleaning up leftover process")) + print(self._node_msg("Cleaning up leftover process"), file=sys.stderr) self.process.kill() def __getattr__(self, name):