mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 20:42:59 +01:00
ba73a3360a
19139ee034d20ebab1b91d3ac13a8eee70b59374 Add documentation for test_shell submodule (JamesC) f5112369cf91451d2d0bf574a9bfdaea04696939 Add TestShell class (James Chiang) 5155602a636c323424f75272ccec38588b3d71cd Move argparse() to init() (JamesC) 2ab01462f48b2d4e0d03ba842c3af8851c67c6f1 Move assert num_nodes is set into main() (JamesC) 614c645643e86c4255b98c663c10f2c227158d4b Clear TestNode objects after shutdown (JamesC) 6f40820757d25ff1ccfdfcbdf2b45b8b65308010 Add closing and flushing of logging handlers (JamesC) 6b71241291a184c9ee197bf5f0c7e1414417a0a0 Refactor TestFramework main() into setup/shutdown (JamesC) ede8b7608e115364b5bb12e7f39d662145733de6 Remove network_event_loop instance in close() (JamesC) Pull request description: This PR refactors BitcoinTestFramework to encapsulate setup and shutdown logic into dedicated methods, and adds a ~~TestWrapper~~ TestShell child class. This wrapper allows the underlying BitcoinTestFramework to run _between user inputs_ in a REPL environment, such as a Jupyter notebook or any interactive Python3 interpreter. The ~~TestWrapper~~ TestShell is motivated by the opportunity to expose the test-framework as a prototyping and educational toolkit. Examples of code prototypes enabled by ~~TestWrapper~~ TestShell can be found in the Optech [Taproot/Schnorr](https://github.com/bitcoinops/taproot-workshop) workshop repository. Usage example: ``` >>> import sys >>> sys.path.insert(0, "/path/to/bitcoin/test/functional") ``` ``` >>> from test_framework.test_wrapper import TestShell >>> test = TestShell() >>> test.setup(num_nodes=2) 20XX-XX-XXTXX:XX:XX.XXXXXXX TestFramework (INFO): Initializing test directory /path/to/bitcoin_func_test_XXXXXXX ``` ``` >>> test.nodes[0].generate(101) >>> test.nodes[0].getblockchaininfo()["blocks"] 101 ``` ``` >>> test.shutdown() 20XX-XX-XXTXX:XX:XX.XXXXXXX TestFramework (INFO): Stopping nodes 20XX-XX-XXTXX:XX:XX.XXXXXXX TestFramework (INFO): Cleaning up /path/to/bitcoin_func_test_XXXXXXX on exit 20XX-XX-XXTXX:XX:XX.XXXXXXX TestFramework (INFO): Tests successful ``` **Overview of changes to BitcoinTestFramework:** - Code moved to `setup()/shutdown()` methods. - Argument parsing logic encapsulated by `parse_args` method. - Success state moved to `BitcoinTestFramework.success`. _During Shutdown_ - `BitcoinTestFramework` logging handlers are flushed and removed. - `BitcoinTestFrameowork.nodes` list is cleared. - `NetworkThread.network_event_loop` is reset. (NetworkThread class). **Behavioural changes:** - Test parameters can now also be set when overriding BitcoinTestFramework.setup() in addition to overriding `set_test_params` method. - Potential exceptions raised in BitcoinTestFramework.setup() will be handled in main(). **Added files:** - ~~test_wrapper.py~~ `test_shell.py` - ~~test-wrapper.md~~ `test-shell.md` ACKs for top commit: jamesob: ACK19139ee034
jonatack: ACK 19139ee034d20ebab1b91d3ac13a8eee70b59374 jnewbery: Rather than invalidate the three ACKs for a minor nit, can you force push back to 19139ee034d20ebab1b91d3ac13a8eee70b59374 please? I think this PR was ready to merge before your last force push. jachiang: > Rather than invalidate the three ACKs for a minor nit, can you force push back to [19139ee](19139ee034
) please? I think this PR was ready to merge before your last force push. jnewbery: ACK 19139ee034d20ebab1b91d3ac13a8eee70b59374 Tree-SHA512: 0c24f405f295a8580a9c8f1b9e0182b5d753eb08cc331424616dd50a062fb773d3719db4d08943365b1f42ccb965cc363b4bcc5beae27ac90b3460b349ed46b2
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)
|