mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-20 02:25:40 +01:00
f5112369cf
A BitcoinTestFramework child class which can be imported by an external user or project. TestShell.setup() initiates an underlying BitcoinTestFramework object with bitcoind subprocesses, rpc interfaces and test logging. TestShell.shutdown() safely tears down the BitcoinTestFramework object.
76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
# Copyright (c) 2019 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
|
|
class TestShell:
|
|
"""Wrapper Class for BitcoinTestFramework.
|
|
|
|
The TestShell class extends the BitcoinTestFramework
|
|
rpc & daemon process management functionality to external
|
|
python environments.
|
|
|
|
It is a singleton class, which ensures that users only
|
|
start a single TestShell at a time."""
|
|
|
|
class __TestShell(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
pass
|
|
|
|
def run_test(self):
|
|
pass
|
|
|
|
def setup(self, **kwargs):
|
|
if self.running:
|
|
print("TestShell is already running!")
|
|
return
|
|
|
|
# Num_nodes parameter must be set
|
|
# by BitcoinTestFramework child class.
|
|
self.num_nodes = kwargs.get('num_nodes', 1)
|
|
kwargs.pop('num_nodes', None)
|
|
|
|
# User parameters override default values.
|
|
for key, value in kwargs.items():
|
|
if hasattr(self, key):
|
|
setattr(self, key, value)
|
|
elif hasattr(self.options, key):
|
|
setattr(self.options, key, value)
|
|
else:
|
|
raise KeyError(key + " not a valid parameter key!")
|
|
|
|
super().setup()
|
|
self.running = True
|
|
|
|
def shutdown(self):
|
|
if not self.running:
|
|
print("TestShell is not running!")
|
|
else:
|
|
super().shutdown()
|
|
self.running = False
|
|
|
|
def reset(self):
|
|
if self.running:
|
|
print("Shutdown TestWrapper before resetting!")
|
|
else:
|
|
self.num_nodes = None
|
|
super().__init__()
|
|
|
|
instance = None
|
|
|
|
def __new__(cls):
|
|
# This implementation enforces singleton pattern, and will return the
|
|
# previously initialized instance if available
|
|
if not TestShell.instance:
|
|
TestShell.instance = TestShell.__TestShell()
|
|
TestShell.instance.running = False
|
|
return TestShell.instance
|
|
|
|
def __getattr__(self, name):
|
|
return getattr(self.instance, name)
|
|
|
|
def __setattr__(self, name, value):
|
|
return setattr(self.instance, name, value)
|