Skip to content

Commit

Permalink
pytest: Add an adaptive MPP test
Browse files Browse the repository at this point in the history
This exercises something that is simply not possible without MPP, i.e., the
bundling of multiple paths to get sufficient capacity to perform the payment.
  • Loading branch information
cdecker committed Jul 13, 2020
1 parent 8f3c455 commit 7f78707
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions tests/test_pay.py
Original file line number Diff line number Diff line change
Expand Up @@ -3083,3 +3083,62 @@ def test_mpp_presplit(node_factory):
inv = l3.rpc.listinvoices()['invoices'][0]

assert(inv['msatoshi'] == inv['msatoshi_received'])


def test_mpp_adaptive(node_factory, bitcoind):
"""We have two paths, both too small on their own, let's combine them.
```dot
digraph {
l1 -> l2;
l2 -> l4;
l1 -> l3;
l3 -> l4;
}
"""
amt = 10**7 - 1
l1, l2, l3, l4 = node_factory.get_nodes(4)

l1.connect(l2)
l2.connect(l4)
l1.connect(l3)
l3.connect(l4)

# First roadblock right away on an outgoing channel
l2.fund_channel(l1, amt)
l2.fund_channel(l4, amt, wait_for_active=True)
l2.rpc.pay(l1.rpc.invoice(
amt + 99999000 - 1, # Slightly less than amt + reserve
label="reb l1->l2",
description="Rebalance l1 -> l2"
)['bolt11'])

# Second path fails only after the first hop
l1.fund_channel(l3, amt)
l4.fund_channel(l3, amt, wait_for_active=True)
l4.rpc.pay(l3.rpc.invoice(
amt + 99999000 - 1, # Slightly less than amt + reserve
label="reb l3->l4",
description="Rebalance l3 -> l4"
)['bolt11'])
l1.rpc.listpeers()

# Make sure neither channel can fit the payment by itself.
c12 = l1.rpc.listpeers(l2.info['id'])['peers'][0]['channels'][0]
c34 = l3.rpc.listpeers(l4.info['id'])['peers'][0]['channels'][0]
assert(c12['spendable_msat'].millisatoshis < amt)
assert(c34['spendable_msat'].millisatoshis < amt)

bitcoind.generate_block(5)
wait_for(lambda: len(l1.rpc.listchannels()['channels']) == 8)

inv = l4.rpc.invoice(
amt,
label="splittest",
description="Needs to be split into at least 2"
)['bolt11']

p = l1.rpc.pay(inv)
from pprint import pprint
pprint(p)
pprint(l1.rpc.paystatus(inv))

0 comments on commit 7f78707

Please sign in to comment.