diff --git a/tests/fixtures.py b/tests/fixtures.py index 4122e13b..f36d24cb 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -189,3 +189,37 @@ def lianad_multisig(bitcoind, directory): raise lianad.cleanup() + + +@pytest.fixture +def lianad_multipath(bitcoind, directory): + datadir = os.path.join(directory, "lianad") + os.makedirs(datadir, exist_ok=True) + bitcoind_cookie = os.path.join(bitcoind.bitcoin_dir, "regtest", ".cookie") + + # A 3-of-4 that degrades into a 3-of-5 after 10 blocks and into a 1-of-10 after 20 blocks. + csv_values = [10, 20] + signer = MultiSigner(4, {csv_values[0]: 5, csv_values[1]: 10}) + prim_multi = multi_expression(3, signer.prim_hds) + first_recov_multi = multi_expression(3, signer.recov_hds[csv_values[0]]) + second_recov_multi = multi_expression(1, signer.recov_hds[csv_values[1]]) + main_desc = Descriptor.from_str( + f"wsh(or_d({prim_multi},or_i(and_v(v:{first_recov_multi},older({csv_values[0]})),and_v(v:{second_recov_multi},older({csv_values[1]})))))" + ) + + lianad = Lianad( + datadir, + signer, + main_desc, + bitcoind.rpcport, + bitcoind_cookie, + ) + + try: + lianad.start() + yield lianad + except Exception: + lianad.cleanup() + raise + + lianad.cleanup() diff --git a/tests/test_misc.py b/tests/test_misc.py index 5222f713..6ea3b285 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -75,6 +75,12 @@ def test_multisig(lianad_multisig, bitcoind): lianad_multisig.rpc.broadcastspend(txid) +def test_multipath(lianad_multipath, bitcoind): + """Exercise various commands as well as recovery with a descriptor with multiple + recovery paths.""" + receive_and_send(lianad_multipath, bitcoind) + + def test_coinbase_deposit(lianad, bitcoind): """Check we detect deposits from (mature) coinbase transactions.""" # Create a new deposit in a coinbase transaction.