tests: explicitly mark tests to run both as v1+v2

By default, tests only run as v1 unless marked as v2.

These tests we want to run as both v1+v2

Includes fixes to have tests pass
This commit is contained in:
niftynei 2021-05-07 13:39:23 -05:00 committed by Rusty Russell
parent dc758f616b
commit 558abe288a
5 changed files with 157 additions and 15 deletions

View File

@ -149,6 +149,8 @@ def test_balance(node_factory):
assert p2['msatoshi_total'] == 10**6 * 1000 assert p2['msatoshi_total'] == 10**6 * 1000
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_bad_opening(node_factory): def test_bad_opening(node_factory):
# l1 asks for a too-long locktime # l1 asks for a too-long locktime
l1 = node_factory.get_node(options={'watchtime-blocks': 100}) l1 = node_factory.get_node(options={'watchtime-blocks': 100})
@ -170,6 +172,8 @@ def test_bad_opening(node_factory):
@pytest.mark.developer("gossip without DEVELOPER=1 is slow") @pytest.mark.developer("gossip without DEVELOPER=1 is slow")
@unittest.skipIf(TEST_NETWORK != 'regtest', "Fee computation and limits are network specific") @unittest.skipIf(TEST_NETWORK != 'regtest', "Fee computation and limits are network specific")
@pytest.mark.slow_test @pytest.mark.slow_test
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_opening_tiny_channel(node_factory): def test_opening_tiny_channel(node_factory):
# Test custom min-capacity-sat parameters # Test custom min-capacity-sat parameters
# #
@ -200,31 +204,36 @@ def test_opening_tiny_channel(node_factory):
l3_min_capacity = 10000 # the current default l3_min_capacity = 10000 # the current default
l4_min_capacity = 20000 # a server with more than default minimum l4_min_capacity = 20000 # a server with more than default minimum
l1, l2, l3, l4 = node_factory.get_nodes(4, opts=[{'min-capacity-sat': 0}, opts = [{'min-capacity-sat': 0},
{'min-capacity-sat': l2_min_capacity}, {'min-capacity-sat': l2_min_capacity},
{'min-capacity-sat': l3_min_capacity}, {'min-capacity-sat': l3_min_capacity},
{'min-capacity-sat': l4_min_capacity}]) {'min-capacity-sat': l4_min_capacity}]
l1, l2, l3, l4 = node_factory.get_nodes(4, opts=opts)
l1.rpc.connect(l2.info['id'], 'localhost', l2.port) l1.rpc.connect(l2.info['id'], 'localhost', l2.port)
l1.rpc.connect(l3.info['id'], 'localhost', l3.port) l1.rpc.connect(l3.info['id'], 'localhost', l3.port)
l1.rpc.connect(l4.info['id'], 'localhost', l4.port) l1.rpc.connect(l4.info['id'], 'localhost', l4.port)
with pytest.raises(RpcError, match=r'They sent error.*channel capacity is .*, which is below .*msat'): with pytest.raises(RpcError, match=r'They sent [error|warning].*channel capacity is .*, which is below .*msat'):
l1.fundchannel(l2, l2_min_capacity + overhead - 1) l1.fundchannel(l2, l2_min_capacity + overhead - 1)
l1.rpc.connect(l2.info['id'], 'localhost', l2.port)
l1.fundchannel(l2, l2_min_capacity + overhead) l1.fundchannel(l2, l2_min_capacity + overhead)
with pytest.raises(RpcError, match=r'They sent error.*channel capacity is .*, which is below .*msat'): with pytest.raises(RpcError, match=r'They sent [error|warning].*channel capacity is .*, which is below .*msat'):
l1.fundchannel(l3, l3_min_capacity + overhead - 1) l1.fundchannel(l3, l3_min_capacity + overhead - 1)
l1.rpc.connect(l3.info['id'], 'localhost', l3.port)
l1.fundchannel(l3, l3_min_capacity + overhead) l1.fundchannel(l3, l3_min_capacity + overhead)
with pytest.raises(RpcError, match=r'They sent error.*channel capacity is .*, which is below .*msat'): with pytest.raises(RpcError, match=r'They sent [error|warning].*channel capacity is .*, which is below .*msat'):
l1.fundchannel(l4, l4_min_capacity + overhead - 1) l1.fundchannel(l4, l4_min_capacity + overhead - 1)
l1.rpc.connect(l4.info['id'], 'localhost', l4.port)
l1.fundchannel(l4, l4_min_capacity + overhead) l1.fundchannel(l4, l4_min_capacity + overhead)
# Note that this check applies locally too, so you can't open it if # Note that this check applies locally too, so you can't open it if
# you would reject it. # you would reject it.
l3.rpc.connect(l2.info['id'], 'localhost', l2.port) l3.rpc.connect(l2.info['id'], 'localhost', l2.port)
with pytest.raises(RpcError, match=r"'message': 'channel capacity.* is .*, which is below .*msat"): with pytest.raises(RpcError, match=r"channel capacity is .*, which is below .*msat"):
l3.fundchannel(l2, l3_min_capacity + overhead - 1) l3.fundchannel(l2, l3_min_capacity + overhead - 1)
l3.rpc.connect(l2.info['id'], 'localhost', l2.port)
l3.fundchannel(l2, l3_min_capacity + overhead) l3.fundchannel(l2, l3_min_capacity + overhead)
@ -238,6 +247,8 @@ def test_second_channel(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_disconnect(node_factory): def test_disconnect(node_factory):
# These should all make us fail # These should all make us fail
disconnects = ['-WIRE_INIT', disconnects = ['-WIRE_INIT',
@ -264,6 +275,8 @@ def test_disconnect(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_disconnect_opener(node_factory): def test_disconnect_opener(node_factory):
# Now error on opener side during channel open. # Now error on opener side during channel open.
disconnects = ['-WIRE_OPEN_CHANNEL', disconnects = ['-WIRE_OPEN_CHANNEL',
@ -306,6 +319,8 @@ def test_disconnect_opener(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_disconnect_fundee(node_factory): def test_disconnect_fundee(node_factory):
# Now error on fundee side during channel open. # Now error on fundee side during channel open.
disconnects = ['-WIRE_ACCEPT_CHANNEL', disconnects = ['-WIRE_ACCEPT_CHANNEL',
@ -382,6 +397,8 @@ def test_disconnect_fundee_v2(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_disconnect_half_signed(node_factory): def test_disconnect_half_signed(node_factory):
# Now, these are the corner cases. Fundee sends funding_signed, # Now, these are the corner cases. Fundee sends funding_signed,
# but opener doesn't receive it. # but opener doesn't receive it.
@ -403,6 +420,8 @@ def test_disconnect_half_signed(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_reconnect_signed(node_factory): def test_reconnect_signed(node_factory):
# This will fail *after* both sides consider channel opening. # This will fail *after* both sides consider channel opening.
disconnects = ['+WIRE_FUNDING_SIGNED'] disconnects = ['+WIRE_FUNDING_SIGNED']
@ -437,6 +456,8 @@ def test_reconnect_signed(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_reconnect_openingd(node_factory): def test_reconnect_openingd(node_factory):
# Openingd thinks we're still opening; opener reconnects.. # Openingd thinks we're still opening; opener reconnects..
disconnects = ['0WIRE_ACCEPT_CHANNEL'] disconnects = ['0WIRE_ACCEPT_CHANNEL']
@ -460,7 +481,10 @@ def test_reconnect_openingd(node_factory):
l1.rpc.connect(l2.info['id'], 'localhost', l2.port) l1.rpc.connect(l2.info['id'], 'localhost', l2.port)
# We should get a message about reconnecting. # We should get a message about reconnecting.
l2.daemon.wait_for_log('Killing opening daemon: Reconnected') if l2.config('experimental-dual-fund'):
l2.daemon.wait_for_log('Killing dualopend: Reconnected')
else:
l2.daemon.wait_for_log('Killing opening daemon: Reconnected')
l2.daemon.wait_for_log('Handed peer, entering loop') l2.daemon.wait_for_log('Handed peer, entering loop')
# Should work fine. # Should work fine.
@ -493,6 +517,8 @@ def test_reconnect_gossiping(node_factory):
@flaky @flaky
@pytest.mark.developer("needs dev-disconnect") @pytest.mark.developer("needs dev-disconnect")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_reconnect_no_update(node_factory, executor, bitcoind): def test_reconnect_no_update(node_factory, executor, bitcoind):
"""Test that funding_locked is retransmitted on reconnect if new channel """Test that funding_locked is retransmitted on reconnect if new channel
@ -578,6 +604,8 @@ def test_connect_stresstest(node_factory, executor):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_reconnect_normal(node_factory): def test_reconnect_normal(node_factory):
# Should reconnect fine even if locked message gets lost. # Should reconnect fine even if locked message gets lost.
disconnects = ['-WIRE_FUNDING_LOCKED', disconnects = ['-WIRE_FUNDING_LOCKED',
@ -592,6 +620,8 @@ def test_reconnect_normal(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_reconnect_sender_add1(node_factory): def test_reconnect_sender_add1(node_factory):
# Fail after add is OK, will cause payment failure though. # Fail after add is OK, will cause payment failure though.
disconnects = ['-WIRE_UPDATE_ADD_HTLC-nocommit', disconnects = ['-WIRE_UPDATE_ADD_HTLC-nocommit',
@ -614,8 +644,8 @@ def test_reconnect_sender_add1(node_factory):
route = [{'msatoshi': amt, 'id': l2.info['id'], 'delay': 5, 'channel': '1x1x1'}] route = [{'msatoshi': amt, 'id': l2.info['id'], 'delay': 5, 'channel': '1x1x1'}]
for i in range(0, len(disconnects)): for i in range(0, len(disconnects)):
l1.rpc.sendpay(route, rhash)
with pytest.raises(RpcError): with pytest.raises(RpcError):
l1.rpc.sendpay(route, rhash)
l1.rpc.waitsendpay(rhash) l1.rpc.waitsendpay(rhash)
# Wait for reconnection. # Wait for reconnection.
@ -626,6 +656,8 @@ def test_reconnect_sender_add1(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_reconnect_sender_add(node_factory): def test_reconnect_sender_add(node_factory):
disconnects = ['-WIRE_COMMITMENT_SIGNED', disconnects = ['-WIRE_COMMITMENT_SIGNED',
'@WIRE_COMMITMENT_SIGNED', '@WIRE_COMMITMENT_SIGNED',
@ -659,6 +691,8 @@ def test_reconnect_sender_add(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_reconnect_receiver_add(node_factory): def test_reconnect_receiver_add(node_factory):
disconnects = ['-WIRE_COMMITMENT_SIGNED', disconnects = ['-WIRE_COMMITMENT_SIGNED',
'@WIRE_COMMITMENT_SIGNED', '@WIRE_COMMITMENT_SIGNED',
@ -723,6 +757,8 @@ def test_reconnect_receiver_fulfill(node_factory):
@flaky @flaky
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_shutdown_reconnect(node_factory): def test_shutdown_reconnect(node_factory):
disconnects = ['-WIRE_SHUTDOWN', disconnects = ['-WIRE_SHUTDOWN',
'@WIRE_SHUTDOWN', '@WIRE_SHUTDOWN',
@ -786,6 +822,8 @@ def test_reconnect_remote_sends_no_sigs(node_factory):
assert(''.join(l1.daemon.logs).count(r'peer_out WIRE_ANNOUNCEMENT_SIGNATURES') == 1) assert(''.join(l1.daemon.logs).count(r'peer_out WIRE_ANNOUNCEMENT_SIGNATURES') == 1)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_shutdown_awaiting_lockin(node_factory, bitcoind): def test_shutdown_awaiting_lockin(node_factory, bitcoind):
l1 = node_factory.get_node() l1 = node_factory.get_node()
l2 = node_factory.get_node(options={'funding-confirms': 3}) l2 = node_factory.get_node(options={'funding-confirms': 3})
@ -823,6 +861,8 @@ def test_shutdown_awaiting_lockin(node_factory, bitcoind):
wait_for(lambda: l2.rpc.listpeers()['peers'] == []) wait_for(lambda: l2.rpc.listpeers()['peers'] == [])
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_funding_change(node_factory, bitcoind): def test_funding_change(node_factory, bitcoind):
"""Add some funds, fund a channel, and make sure we remember the change """Add some funds, fund a channel, and make sure we remember the change
""" """
@ -845,6 +885,8 @@ def test_funding_change(node_factory, bitcoind):
assert outputs[2] == 10000000 assert outputs[2] == 10000000
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_funding_all(node_factory, bitcoind): def test_funding_all(node_factory, bitcoind):
"""Add some funds, fund a channel using all funds, make sure no funds remain """Add some funds, fund a channel using all funds, make sure no funds remain
""" """
@ -863,6 +905,8 @@ def test_funding_all(node_factory, bitcoind):
assert len(outputs) == 0 assert len(outputs) == 0
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_funding_all_too_much(node_factory): def test_funding_all_too_much(node_factory):
"""Add more than max possible funds, fund a channel using all funds we can. """Add more than max possible funds, fund a channel using all funds we can.
""" """
@ -886,6 +930,8 @@ def test_funding_all_too_much(node_factory):
assert only_one(l1.rpc.listfunds()['channels'])['channel_total_sat'] == 2**24 - 1 assert only_one(l1.rpc.listfunds()['channels'])['channel_total_sat'] == 2**24 - 1
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_funding_fail(node_factory, bitcoind): def test_funding_fail(node_factory, bitcoind):
"""Add some funds, fund a channel without enough funds""" """Add some funds, fund a channel without enough funds"""
# Previous runs with same bitcoind can leave funds! # Previous runs with same bitcoind can leave funds!
@ -907,8 +953,13 @@ def test_funding_fail(node_factory, bitcoind):
with pytest.raises(RpcError, match=r'to_self_delay \d+ larger than \d+'): with pytest.raises(RpcError, match=r'to_self_delay \d+ larger than \d+'):
l1.rpc.fundchannel(l2.info['id'], int(funds / 10)) l1.rpc.fundchannel(l2.info['id'], int(funds / 10))
assert only_one(l1.rpc.listpeers()['peers'])['connected'] # dual-funded channels disconnect on failure
assert only_one(l2.rpc.listpeers()['peers'])['connected'] if not l1.config('experimental-dual-fund'):
assert only_one(l1.rpc.listpeers()['peers'])['connected']
assert only_one(l2.rpc.listpeers()['peers'])['connected']
else:
assert len(l1.rpc.listpeers()['peers']) == 0
assert len(l2.rpc.listpeers()['peers']) == 0
# Restart l2 without ridiculous locktime. # Restart l2 without ridiculous locktime.
del l2.daemon.opts['watchtime-blocks'] del l2.daemon.opts['watchtime-blocks']
@ -919,7 +970,7 @@ def test_funding_fail(node_factory, bitcoind):
with pytest.raises(RpcError, match=r'not afford'): with pytest.raises(RpcError, match=r'not afford'):
l1.rpc.fundchannel(l2.info['id'], funds) l1.rpc.fundchannel(l2.info['id'], funds)
# Should still be connected. # Should still be connected (we didn't contact the peer)
assert only_one(l1.rpc.listpeers()['peers'])['connected'] assert only_one(l1.rpc.listpeers()['peers'])['connected']
l2.daemon.wait_for_log('Handed peer, entering loop') l2.daemon.wait_for_log('Handed peer, entering loop')
assert only_one(l2.rpc.listpeers()['peers'])['connected'] assert only_one(l2.rpc.listpeers()['peers'])['connected']
@ -928,6 +979,8 @@ def test_funding_fail(node_factory, bitcoind):
l1.rpc.fundchannel(l2.info['id'], int(funds / 10)) l1.rpc.fundchannel(l2.info['id'], int(funds / 10))
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_funding_toolarge(node_factory, bitcoind): def test_funding_toolarge(node_factory, bitcoind):
"""Try to create a giant channel""" """Try to create a giant channel"""
l1 = node_factory.get_node() l1 = node_factory.get_node()
@ -976,6 +1029,7 @@ def test_v2_open(node_factory, bitcoind, chainparams):
assert(result['status'] == 'complete') assert(result['status'] == 'complete')
@pytest.mark.openchannel('v1')
def test_funding_push(node_factory, bitcoind, chainparams): def test_funding_push(node_factory, bitcoind, chainparams):
""" Try to push peer some sats """ """ Try to push peer some sats """
# We track balances, to verify that accounting is ok. # We track balances, to verify that accounting is ok.
@ -1020,6 +1074,8 @@ def test_funding_push(node_factory, bitcoind, chainparams):
assert account_balance(l1, chanid) == (amount - push_sat) * 1000 assert account_balance(l1, chanid) == (amount - push_sat) * 1000
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_funding_by_utxos(node_factory, bitcoind): def test_funding_by_utxos(node_factory, bitcoind):
"""Fund a channel with specific utxos""" """Fund a channel with specific utxos"""
l1, l2, l3 = node_factory.line_graph(3, fundchannel=False) l1, l2, l3 = node_factory.line_graph(3, fundchannel=False)
@ -1256,6 +1312,8 @@ def test_funding_cancel_race(node_factory, bitcoind, executor):
executor.map(lambda n: n.stop(), node_factory.nodes) executor.map(lambda n: n.stop(), node_factory.nodes)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
@unittest.skipIf(TEST_NETWORK != 'regtest', "External wallet support doesn't work with elements yet.") @unittest.skipIf(TEST_NETWORK != 'regtest', "External wallet support doesn't work with elements yet.")
def test_funding_close_upfront(node_factory, bitcoind): def test_funding_close_upfront(node_factory, bitcoind):
opts = {'plugin': os.path.join(os.getcwd(), 'tests/plugins/openchannel_hook_accepter.py')} opts = {'plugin': os.path.join(os.getcwd(), 'tests/plugins/openchannel_hook_accepter.py')}
@ -1483,6 +1541,8 @@ def test_multifunding_v2_exclusive(node_factory, bitcoind):
l1.rpc.pay(inv) l1.rpc.pay(inv)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_multifunding_simple(node_factory, bitcoind): def test_multifunding_simple(node_factory, bitcoind):
''' '''
Simple test for multifundchannel. Simple test for multifundchannel.
@ -1509,6 +1569,8 @@ def test_multifunding_simple(node_factory, bitcoind):
l1.rpc.pay(inv) l1.rpc.pay(inv)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_multifunding_one(node_factory, bitcoind): def test_multifunding_one(node_factory, bitcoind):
''' '''
Test that multifunding can still fund to one destination. Test that multifunding can still fund to one destination.
@ -1541,6 +1603,7 @@ def test_multifunding_one(node_factory, bitcoind):
@pytest.mark.developer("needs dev-disconnect") @pytest.mark.developer("needs dev-disconnect")
@pytest.mark.openchannel('v1')
def test_multifunding_disconnect(node_factory): def test_multifunding_disconnect(node_factory):
''' '''
Test disconnection during multifundchannel Test disconnection during multifundchannel
@ -1592,6 +1655,8 @@ def test_multifunding_disconnect(node_factory):
l1.rpc.multifundchannel(destinations) l1.rpc.multifundchannel(destinations)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_multifunding_wumbo(node_factory): def test_multifunding_wumbo(node_factory):
''' '''
Test wumbo channel imposition in multifundchannel. Test wumbo channel imposition in multifundchannel.
@ -1621,6 +1686,7 @@ def test_multifunding_wumbo(node_factory):
@unittest.skipIf(TEST_NETWORK == 'liquid-regtest', "Fees on elements are different") @unittest.skipIf(TEST_NETWORK == 'liquid-regtest', "Fees on elements are different")
@pytest.mark.developer("uses dev-fail") @pytest.mark.developer("uses dev-fail")
@pytest.mark.openchannel('v1') # v2 the weight calculation is off by 3
def test_multifunding_feerates(node_factory, bitcoind): def test_multifunding_feerates(node_factory, bitcoind):
''' '''
Test feerate parameters for multifundchannel Test feerate parameters for multifundchannel
@ -1724,6 +1790,7 @@ def test_multifunding_param_failures(node_factory):
l1.rpc.multifundchannel(destinations) l1.rpc.multifundchannel(destinations)
@pytest.mark.openchannel('v1')
@pytest.mark.developer("disconnect=... needs DEVELOPER=1") @pytest.mark.developer("disconnect=... needs DEVELOPER=1")
def test_multifunding_best_effort(node_factory, bitcoind): def test_multifunding_best_effort(node_factory, bitcoind):
''' '''
@ -1796,6 +1863,8 @@ def test_multifunding_best_effort(node_factory, bitcoind):
l1.rpc.multifundchannel(destinations, minchannels=1) l1.rpc.multifundchannel(destinations, minchannels=1)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_lockin_between_restart(node_factory, bitcoind): def test_lockin_between_restart(node_factory, bitcoind):
l1 = node_factory.get_node(may_reconnect=True) l1 = node_factory.get_node(may_reconnect=True)
l2 = node_factory.get_node(options={'funding-confirms': 3}, l2 = node_factory.get_node(options={'funding-confirms': 3},
@ -1819,6 +1888,8 @@ def test_lockin_between_restart(node_factory, bitcoind):
l2.daemon.wait_for_log(' to CHANNELD_NORMAL') l2.daemon.wait_for_log(' to CHANNELD_NORMAL')
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_funding_while_offline(node_factory, bitcoind): def test_funding_while_offline(node_factory, bitcoind):
l1 = node_factory.get_node() l1 = node_factory.get_node()
addr = l1.rpc.newaddr()['bech32'] addr = l1.rpc.newaddr()['bech32']
@ -1841,6 +1912,8 @@ def test_funding_while_offline(node_factory, bitcoind):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_channel_persistence(node_factory, bitcoind, executor): def test_channel_persistence(node_factory, bitcoind, executor):
# Start two nodes and open a channel (to remember). l2 will # Start two nodes and open a channel (to remember). l2 will
# mysteriously die while committing the first HTLC so we can # mysteriously die while committing the first HTLC so we can
@ -1918,6 +1991,8 @@ def test_channel_persistence(node_factory, bitcoind, executor):
@pytest.mark.developer("gossip without DEVELOPER=1 is slow") @pytest.mark.developer("gossip without DEVELOPER=1 is slow")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_private_channel(node_factory): def test_private_channel(node_factory):
l1, l2 = node_factory.line_graph(2, announce_channels=False, wait_for_announce=False) l1, l2 = node_factory.line_graph(2, announce_channels=False, wait_for_announce=False)
l3, l4 = node_factory.line_graph(2, announce_channels=True, wait_for_announce=True) l3, l4 = node_factory.line_graph(2, announce_channels=True, wait_for_announce=True)
@ -2200,6 +2275,8 @@ def test_multiple_channels(node_factory):
@pytest.mark.developer @pytest.mark.developer
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_forget_channel(node_factory): def test_forget_channel(node_factory):
l1 = node_factory.get_node() l1 = node_factory.get_node()
l2 = node_factory.get_node() l2 = node_factory.get_node()
@ -2228,6 +2305,8 @@ def test_forget_channel(node_factory):
assert l2.db_query("SELECT count(*) as c FROM channels;")[0]['c'] == 1 assert l2.db_query("SELECT count(*) as c FROM channels;")[0]['c'] == 1
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_peerinfo(node_factory, bitcoind): def test_peerinfo(node_factory, bitcoind):
l1, l2 = node_factory.line_graph(2, fundchannel=False, opts={'may_reconnect': True}) l1, l2 = node_factory.line_graph(2, fundchannel=False, opts={'may_reconnect': True})
@ -2319,6 +2398,8 @@ def test_disconnectpeer(node_factory, bitcoind):
@pytest.mark.developer("needs --dev-max-funding-unconfirmed-blocks") @pytest.mark.developer("needs --dev-max-funding-unconfirmed-blocks")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_fundee_forget_funding_tx_unconfirmed(node_factory, bitcoind): def test_fundee_forget_funding_tx_unconfirmed(node_factory, bitcoind):
"""Test that fundee will forget the channel if """Test that fundee will forget the channel if
the funding tx has been unconfirmed for too long. the funding tx has been unconfirmed for too long.
@ -2498,6 +2579,8 @@ def test_opener_simple_reconnect(node_factory, bitcoind):
@unittest.skipIf(os.getenv('TEST_DB_PROVIDER', 'sqlite3') != 'sqlite3', "sqlite3-specific DB rollback") @unittest.skipIf(os.getenv('TEST_DB_PROVIDER', 'sqlite3') != 'sqlite3', "sqlite3-specific DB rollback")
@pytest.mark.developer("needs LIGHTNINGD_DEV_LOG_IO") @pytest.mark.developer("needs LIGHTNINGD_DEV_LOG_IO")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_dataloss_protection(node_factory, bitcoind): def test_dataloss_protection(node_factory, bitcoind):
l1 = node_factory.get_node(may_reconnect=True, options={'log-level': 'io'}, l1 = node_factory.get_node(may_reconnect=True, options={'log-level': 'io'},
feerates=(7500, 7500, 7500, 7500)) feerates=(7500, 7500, 7500, 7500))
@ -2757,6 +2840,8 @@ def test_restart_many_payments(node_factory, bitcoind):
@pytest.mark.developer("need dev-disconnect") @pytest.mark.developer("need dev-disconnect")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_fail_unconfirmed(node_factory, bitcoind, executor): def test_fail_unconfirmed(node_factory, bitcoind, executor):
"""Test that if we crash with an unconfirmed connection to a known """Test that if we crash with an unconfirmed connection to a known
peer, we don't have a dangling peer in db""" peer, we don't have a dangling peer in db"""
@ -2857,6 +2942,8 @@ def test_fail_unconfirmed_openchannel2(node_factory, bitcoind, executor):
l1.fundchannel(l2, 200000, wait_for_active=True) l1.fundchannel(l2, 200000, wait_for_active=True)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_change_chaining(node_factory, bitcoind): def test_change_chaining(node_factory, bitcoind):
"""Test change chaining of unconfirmed fundings """Test change chaining of unconfirmed fundings
@ -2997,6 +3084,8 @@ def test_pay_disconnect_stress(node_factory, executor):
fut.result() fut.result()
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_wumbo_channels(node_factory, bitcoind): def test_wumbo_channels(node_factory, bitcoind):
l1, l2, l3 = node_factory.get_nodes(3, l1, l2, l3 = node_factory.get_nodes(3,
opts=[{'large-channels': None}, opts=[{'large-channels': None},
@ -3060,6 +3149,8 @@ def test_wumbo_channels(node_factory, bitcoind):
assert Millisatoshi(amount) > Millisatoshi(str((1 << 24) - 1) + "sat") assert Millisatoshi(amount) > Millisatoshi(str((1 << 24) - 1) + "sat")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_channel_features(node_factory, bitcoind): def test_channel_features(node_factory, bitcoind):
l1, l2 = node_factory.line_graph(2, fundchannel=False) l1, l2 = node_factory.line_graph(2, fundchannel=False)
@ -3107,6 +3198,7 @@ def test_nonstatic_channel(node_factory, bitcoind):
@pytest.mark.developer("need --dev-timeout-secs") @pytest.mark.developer("need --dev-timeout-secs")
@pytest.mark.openchannel('v1')
def test_connection_timeout(node_factory): def test_connection_timeout(node_factory):
# l1 hears nothing back after sending INIT, should time out. # l1 hears nothing back after sending INIT, should time out.
l1, l2 = node_factory.get_nodes(2, l1, l2 = node_factory.get_nodes(2,

View File

@ -1027,6 +1027,8 @@ def test_gossip_store_load_amount_truncated(node_factory):
@pytest.mark.developer("Needs fast gossip propagation") @pytest.mark.developer("Needs fast gossip propagation")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_node_reannounce(node_factory, bitcoind): def test_node_reannounce(node_factory, bitcoind):
"Test that we reannounce a node when parameters change" "Test that we reannounce a node when parameters change"
l1, l2 = node_factory.line_graph(2, opts={'may_reconnect': True, l1, l2 = node_factory.line_graph(2, opts={'may_reconnect': True,

View File

@ -28,6 +28,7 @@ import unittest
@pytest.mark.developer("needs --dev-disconnect") @pytest.mark.developer("needs --dev-disconnect")
@pytest.mark.openchannel('v1')
def test_stop_pending_fundchannel(node_factory, executor): def test_stop_pending_fundchannel(node_factory, executor):
"""Stop the daemon while waiting for an accept_channel """Stop the daemon while waiting for an accept_channel
@ -161,6 +162,8 @@ def test_bitcoin_ibd(node_factory, bitcoind):
assert 'warning_bitcoind_sync' not in l1.rpc.getinfo() assert 'warning_bitcoind_sync' not in l1.rpc.getinfo()
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_lightningd_still_loading(node_factory, bitcoind, executor): def test_lightningd_still_loading(node_factory, bitcoind, executor):
"""Test that we recognize we haven't got all blocks from bitcoind""" """Test that we recognize we haven't got all blocks from bitcoind"""
@ -1151,6 +1154,8 @@ def test_blockchaintrack(node_factory, bitcoind):
@pytest.mark.developer("needs DEVELOPER=1") @pytest.mark.developer("needs DEVELOPER=1")
@pytest.mark.openchannel('v2')
@pytest.mark.openchannel('v1')
def test_funding_reorg_private(node_factory, bitcoind): def test_funding_reorg_private(node_factory, bitcoind):
"""Change funding tx height after lockin, between node restart. """Change funding tx height after lockin, between node restart.
""" """
@ -1192,6 +1197,8 @@ def test_funding_reorg_private(node_factory, bitcoind):
@pytest.mark.developer("needs DEVELOPER=1") @pytest.mark.developer("needs DEVELOPER=1")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_funding_reorg_remote_lags(node_factory, bitcoind): def test_funding_reorg_remote_lags(node_factory, bitcoind):
"""Nodes may disagree about short_channel_id before channel announcement """Nodes may disagree about short_channel_id before channel announcement
""" """
@ -1335,6 +1342,8 @@ def test_bitcoind_goes_backwards(node_factory, bitcoind):
@flaky @flaky
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_reserve_enforcement(node_factory, executor): def test_reserve_enforcement(node_factory, executor):
"""Channeld should disallow you spending into your reserve""" """Channeld should disallow you spending into your reserve"""
l1, l2 = node_factory.line_graph(2, opts={'may_reconnect': True, 'allow_warning': True}) l1, l2 = node_factory.line_graph(2, opts={'may_reconnect': True, 'allow_warning': True})
@ -1870,6 +1879,8 @@ def test_dev_demux(node_factory):
l1.rpc.call('dev', {'subcommand': 'crash'}) l1.rpc.call('dev', {'subcommand': 'crash'})
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_list_features_only(node_factory): def test_list_features_only(node_factory):
features = subprocess.check_output(['lightningd/lightningd', features = subprocess.check_output(['lightningd/lightningd',
'--list-features-only']).decode('utf-8').splitlines() '--list-features-only']).decode('utf-8').splitlines()

View File

@ -22,6 +22,8 @@ import unittest
@pytest.mark.developer("needs to deactivate shadow routing") @pytest.mark.developer("needs to deactivate shadow routing")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_pay(node_factory): def test_pay(node_factory):
l1, l2 = node_factory.line_graph(2) l1, l2 = node_factory.line_graph(2)
@ -339,6 +341,8 @@ def test_pay_optional_args(node_factory, compat):
@pytest.mark.developer("needs to deactivate shadow routing") @pytest.mark.developer("needs to deactivate shadow routing")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_payment_success_persistence(node_factory, bitcoind, executor): def test_payment_success_persistence(node_factory, bitcoind, executor):
# Start two nodes and open a channel.. die during payment. # Start two nodes and open a channel.. die during payment.
# Feerates identical so we don't get gratuitous commit to update them # Feerates identical so we don't get gratuitous commit to update them
@ -390,6 +394,8 @@ def test_payment_success_persistence(node_factory, bitcoind, executor):
@pytest.mark.developer("needs DEVELOPER=1") @pytest.mark.developer("needs DEVELOPER=1")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_payment_failed_persistence(node_factory, executor): def test_payment_failed_persistence(node_factory, executor):
# Start two nodes and open a channel.. die during payment. # Start two nodes and open a channel.. die during payment.
# Feerates identical so we don't get gratuitous commit to update them # Feerates identical so we don't get gratuitous commit to update them
@ -2635,6 +2641,8 @@ def test_sendonion_rpc(node_factory):
@pytest.mark.developer("needs dev-disconnect, dev-no-htlc-timeout") @pytest.mark.developer("needs dev-disconnect, dev-no-htlc-timeout")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_partial_payment(node_factory, bitcoind, executor): def test_partial_payment(node_factory, bitcoind, executor):
# We want to test two payments at the same time, before we send commit # We want to test two payments at the same time, before we send commit
l1, l2, l3, l4 = node_factory.get_nodes(4, [{}] + [{'disconnect': ['=WIRE_UPDATE_ADD_HTLC-nocommit'], 'dev-no-htlc-timeout': None}] * 2 + [{'plugin': os.path.join(os.getcwd(), 'tests/plugins/print_htlc_onion.py')}]) l1, l2, l3, l4 = node_factory.get_nodes(4, [{}] + [{'disconnect': ['=WIRE_UPDATE_ADD_HTLC-nocommit'], 'dev-no-htlc-timeout': None}] * 2 + [{'plugin': os.path.join(os.getcwd(), 'tests/plugins/print_htlc_onion.py')}])
@ -3522,6 +3530,8 @@ def test_mpp_waitblockheight_routehint_conflict(node_factory, bitcoind, executor
@pytest.mark.developer("channel setup very slow (~10 minutes) if not DEVELOPER") @pytest.mark.developer("channel setup very slow (~10 minutes) if not DEVELOPER")
@pytest.mark.slow_test @pytest.mark.slow_test
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_mpp_interference_2(node_factory, bitcoind, executor): def test_mpp_interference_2(node_factory, bitcoind, executor):
''' '''
We create a "public network" that looks like so. We create a "public network" that looks like so.

View File

@ -575,6 +575,8 @@ def test_invoice_payment_hook_hold(node_factory):
l1.rpc.pay(inv1['bolt11']) l1.rpc.pay(inv1['bolt11'])
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_openchannel_hook(node_factory, bitcoind): def test_openchannel_hook(node_factory, bitcoind):
""" l2 uses the reject_odd_funding_amounts plugin to reject some openings. """ l2 uses the reject_odd_funding_amounts plugin to reject some openings.
""" """
@ -631,6 +633,8 @@ def test_openchannel_hook(node_factory, bitcoind):
l1.rpc.fundchannel(l2.info['id'], 100001) l1.rpc.fundchannel(l2.info['id'], 100001)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_openchannel_hook_error_handling(node_factory, bitcoind): def test_openchannel_hook_error_handling(node_factory, bitcoind):
""" l2 uses a plugin that should fatal() crash the node. """ l2 uses a plugin that should fatal() crash the node.
@ -653,6 +657,8 @@ def test_openchannel_hook_error_handling(node_factory, bitcoind):
assert l2.daemon.is_in_log("BROKEN.*Plugin rejected openchannel[2]? but also set close_to") assert l2.daemon.is_in_log("BROKEN.*Plugin rejected openchannel[2]? but also set close_to")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_openchannel_hook_chaining(node_factory, bitcoind): def test_openchannel_hook_chaining(node_factory, bitcoind):
""" l2 uses a set of plugin that all use the openchannel_hook. """ l2 uses a set of plugin that all use the openchannel_hook.
@ -672,7 +678,7 @@ def test_openchannel_hook_chaining(node_factory, bitcoind):
hook_msg = "openchannel2? hook rejects and says '" hook_msg = "openchannel2? hook rejects and says '"
# 100005sat fundchannel should fail fatal() for l2 # 100005sat fundchannel should fail fatal() for l2
# because hook_accepter.py rejects on that amount 'for a reason' # because hook_accepter.py rejects on that amount 'for a reason'
with pytest.raises(RpcError, match=r'They sent error channel'): with pytest.raises(RpcError, match=r'reject for a reason'):
l1.rpc.fundchannel(l2.info['id'], 100005) l1.rpc.fundchannel(l2.info['id'], 100005)
assert l2.daemon.wait_for_log(hook_msg + "reject for a reason") assert l2.daemon.wait_for_log(hook_msg + "reject for a reason")
@ -683,11 +689,14 @@ def test_openchannel_hook_chaining(node_factory, bitcoind):
# 100000sat is good for hook_accepter, so it should fail 'on principle' # 100000sat is good for hook_accepter, so it should fail 'on principle'
# at third hook openchannel_reject.py # at third hook openchannel_reject.py
with pytest.raises(RpcError, match=r'They sent error channel'): with pytest.raises(RpcError, match=r'reject on principle'):
l1.rpc.connect(l2.info['id'], 'localhost', l2.port)
l1.rpc.fundchannel(l2.info['id'], 100000) l1.rpc.fundchannel(l2.info['id'], 100000)
assert l2.daemon.wait_for_log(hook_msg + "reject on principle") assert l2.daemon.wait_for_log(hook_msg + "reject on principle")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_channel_state_changed_bilateral(node_factory, bitcoind): def test_channel_state_changed_bilateral(node_factory, bitcoind):
""" We open and close a channel and check notifications both sides. """ We open and close a channel and check notifications both sides.
@ -826,6 +835,8 @@ def test_channel_state_changed_bilateral(node_factory, bitcoind):
assert(event2['message'] == "Onchain init reply") assert(event2['message'] == "Onchain init reply")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_channel_state_changed_unilateral(node_factory, bitcoind): def test_channel_state_changed_unilateral(node_factory, bitcoind):
""" We open, disconnect, force-close a channel and check for notifications. """ We open, disconnect, force-close a channel and check for notifications.
@ -926,6 +937,8 @@ def test_channel_state_changed_unilateral(node_factory, bitcoind):
assert(event1['message'] == "Onchain init reply") assert(event1['message'] == "Onchain init reply")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_channel_state_change_history(node_factory, bitcoind): def test_channel_state_change_history(node_factory, bitcoind):
""" We open and close a channel and check for state_canges entries. """ We open and close a channel and check for state_canges entries.
@ -1448,6 +1461,8 @@ def test_libplugin_deprecated(node_factory):
@unittest.skipIf( @unittest.skipIf(
not DEVELOPER or DEPRECATED_APIS, "needs LIGHTNINGD_DEV_LOG_IO and new API" not DEVELOPER or DEPRECATED_APIS, "needs LIGHTNINGD_DEV_LOG_IO and new API"
) )
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_plugin_feature_announce(node_factory): def test_plugin_feature_announce(node_factory):
"""Check that features registered by plugins show up in messages. """Check that features registered by plugins show up in messages.
@ -1702,6 +1717,8 @@ def test_hook_crash(node_factory, executor, bitcoind):
f1.result(10) f1.result(10)
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_feature_set(node_factory): def test_feature_set(node_factory):
plugin = os.path.join(os.path.dirname(__file__), 'plugins/show_feature_set.py') plugin = os.path.join(os.path.dirname(__file__), 'plugins/show_feature_set.py')
l1 = node_factory.get_node(options={"plugin": plugin}) l1 = node_factory.get_node(options={"plugin": plugin})
@ -1828,6 +1845,8 @@ def test_plugin_fail(node_factory):
@pytest.mark.developer("without DEVELOPER=1, gossip v slow") @pytest.mark.developer("without DEVELOPER=1, gossip v slow")
@pytest.mark.openchannel('v1')
@pytest.mark.openchannel('v2')
def test_coin_movement_notices(node_factory, bitcoind, chainparams): def test_coin_movement_notices(node_factory, bitcoind, chainparams):
"""Verify that coin movements are triggered correctly. """Verify that coin movements are triggered correctly.
""" """
@ -1916,6 +1935,14 @@ def test_coin_movement_notices(node_factory, bitcoind, chainparams):
# Special case for dual-funded channel opens # Special case for dual-funded channel opens
if l2.config('experimental-dual-fund'): if l2.config('experimental-dual-fund'):
# option_anchor_outputs
l2_l3_mvts = [
{'type': 'chain_mvt', 'credit': 1000000000, 'debit': 0, 'tag': 'deposit'},
{'type': 'channel_mvt', 'credit': 0, 'debit': 100000000, 'tag': 'routed'},
{'type': 'channel_mvt', 'credit': 50000501, 'debit': 0, 'tag': 'routed'},
{'type': 'chain_mvt', 'credit': 0, 'debit': 4215501, 'tag': 'chain_fees'},
{'type': 'chain_mvt', 'credit': 0, 'debit': 945785000, 'tag': 'withdrawal'},
]
l2_wallet_mvts = [ l2_wallet_mvts = [
{'type': 'chain_mvt', 'credit': 2000000000, 'debit': 0, 'tag': 'deposit'}, {'type': 'chain_mvt', 'credit': 2000000000, 'debit': 0, 'tag': 'deposit'},
{'type': 'chain_mvt', 'credit': 0, 'debit': 0, 'tag': 'spend_track'}, {'type': 'chain_mvt', 'credit': 0, 'debit': 0, 'tag': 'spend_track'},