lndmanage/test/testing_common.py
2023-12-31 12:16:04 +01:00

112 lines
3.7 KiB
Python

"""Common test utilities for integration tests."""
import os
import shutil
from unittest import TestCase
import logging.config
from lnregtest.lib.network import Network
from lndmanage import settings
from lndmanage.lib.node import LndNode
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# testing base folder
test_dir = os.path.dirname(os.path.realpath(__file__))
bin_dir = os.path.join(test_dir, 'bin')
graph_definitions_dir = os.path.join(test_dir, 'graph_definitions')
test_data_dir = os.path.join(test_dir, 'test_data')
# set lndmanage_home path to be in the test_data folder and make sure the
# directory exists
lndmanage_home = os.path.join(test_data_dir, 'lndmanage')
os.makedirs(lndmanage_home, exist_ok=True)
# create empty config and set env var to not trigger error when importing
# settings
open(os.path.join(lndmanage_home, 'config.ini'), 'a').close()
os.environ.setdefault('LNDMANAGE_HOME', lndmanage_home)
settings.CACHING_RETENTION_MINUTES = 0
# constants for testing
SLEEP_SEC_AFTER_REBALANCING = 2
test_graphs_paths = {
'star_ring_3_liquid': os.path.join(
graph_definitions_dir, 'star_ring_3_liquid.py'),
'star_ring_4_unbalanced': os.path.join(
graph_definitions_dir, 'star_ring_4_unbalanced.py'),
'star_ring_4_illiquid': os.path.join(
graph_definitions_dir, 'star_ring_4_illiquid.py'),
'empty_graph': os.path.join(
graph_definitions_dir, 'empty_graph.py'),
}
class TestNetwork(TestCase):
"""
Class for spinning up simulated Lightning Networks to do integration
testing.
The implementation inheriting from this class needs to implement the
graph_test method, which tests properties specific to the chosen test
network graph. The attribute network_definition is a string that points
to the file location of a network graph definition in terms of a dict.
"""
network_definition = None
def setUp(self):
if self.network_definition is None:
self.skipTest("This class doesn't represent a real test case.")
raise NotImplementedError("A network definition path needs to be "
"given.")
# we delete previous test data
try:
shutil.rmtree(lndmanage_home)
except FileNotFoundError:
pass
os.mkdir(lndmanage_home)
self.testnet = Network(
binary_folder=bin_dir,
network_definition_location=self.network_definition,
nodedata_folder=test_data_dir,
node_limit='H',
from_scratch=True
)
self.testnet.run_nocleanup()
# to run the lightning network in the background and do some testing
# here, run:
# $ lnregtest --nodedata_folder /path/to/lndmanage/test/test_data/
# self.testnet.run_from_background()
# logger.info("Generated network information:")
# logger.info(format_dict(self.testnet.node_mapping))
# logger.info(format_dict(self.testnet.channel_mapping))
# logger.info(format_dict(self.testnet.assemble_graph()))
master_node_data_dir = self.testnet.master_node.data_dir
master_node_port = self.testnet.master_node._grpc_port
self.master_node_graph_view = self.testnet.master_node_graph_view()
self.lndnode = LndNode(
lnd_home=master_node_data_dir,
lnd_host='localhost:' + str(master_node_port),
regtest=True, use_admin=True,
)
self.graph_test()
def tearDown(self):
self.testnet.cleanup()
del self.testnet
def graph_test(self):
"""
graph_test should be implemented by each subclass test and check,
whether the test graph has the correct shape.
"""
raise NotImplementedError