Browse Source

pytest: Stabilize test_funding_close_upfront

Reconnections and unsynchronized states where causing us some issues.
master
Christian Decker 4 years ago
committed by Rusty Russell
parent
commit
1463797c61
  1. 35
      tests/test_connection.py

35
tests/test_connection.py

@ -1260,39 +1260,46 @@ def test_funding_close_upfront(node_factory, bitcoind):
channel = node.rpc.listpeers()['peers'][0]['channels'][-1] channel = node.rpc.listpeers()['peers'][0]['channels'][-1]
assert amount * 1000 == channel['msatoshi_total'] assert amount * 1000 == channel['msatoshi_total']
def _close(src, dst, addr=None):
"""Close the channel from src to dst, with the specified address.
Returns the address of the outputs in the close tx. Raises an
error if some expectations are not met.
"""
r = l1.rpc.close(l2.info['id'], destination=addr)
assert r['type'] == 'mutual'
tx = bitcoind.rpc.decoderawtransaction(r['tx'])
addrs = [vout['scriptPubKey']['addresses'][0] for vout in tx['vout']]
bitcoind.generate_block(1, wait_for_mempool=[r['txid']])
sync_blockheight(bitcoind, [l1, l2])
return addrs
# check that normal peer close works # check that normal peer close works
_fundchannel(l1, l2, amt_normal, None) _fundchannel(l1, l2, amt_normal, None)
assert l1.rpc.close(l2.info['id'])['type'] == 'mutual' _close(l1, l2)
# check that you can provide a closing address upfront # check that you can provide a closing address upfront
addr = l1.rpc.newaddr()['bech32'] addr = l1.rpc.newaddr()['bech32']
_fundchannel(l1, l2, amt_normal, addr) _fundchannel(l1, l2, amt_normal, addr)
# confirm that it appears in listpeers # confirm that it appears in listpeers
assert addr == only_one(l1.rpc.listpeers()['peers'])['channels'][1]['close_to_addr'] assert addr == only_one(l1.rpc.listpeers()['peers'])['channels'][1]['close_to_addr']
resp = l1.rpc.close(l2.info['id']) assert _close(l1, l2) == [addr]
assert resp['type'] == 'mutual'
assert only_one(only_one(bitcoind.rpc.decoderawtransaction(resp['tx'])['vout'])['scriptPubKey']['addresses']) == addr
# check that passing in the same addr to close works # check that passing in the same addr to close works
addr = bitcoind.rpc.getnewaddress() addr = bitcoind.rpc.getnewaddress()
_fundchannel(l1, l2, amt_normal, addr) _fundchannel(l1, l2, amt_normal, addr)
assert addr == only_one(l1.rpc.listpeers()['peers'])['channels'][2]['close_to_addr'] assert addr == only_one(l1.rpc.listpeers()['peers'])['channels'][2]['close_to_addr']
resp = l1.rpc.close(l2.info['id'], destination=addr) assert _close(l1, l2, addr) == [addr]
assert resp['type'] == 'mutual'
assert only_one(only_one(bitcoind.rpc.decoderawtransaction(resp['tx'])['vout'])['scriptPubKey']['addresses']) == addr
# check that remote peer closing works as expected (and that remote's close_to works) # check that remote peer closing works as expected (and that remote's close_to works)
_fundchannel(l1, l2, amt_addr, addr) _fundchannel(l1, l2, amt_addr, addr)
# send some money to remote so that they have a closeout # send some money to remote so that they have a closeout
l1.rpc.pay(l2.rpc.invoice((amt_addr // 2) * 1000, 'test_remote_close_to', 'desc')['bolt11']) l1.rpc.pay(l2.rpc.invoice((amt_addr // 2) * 1000, 'test_remote_close_to', 'desc')['bolt11'])
assert only_one(l2.rpc.listpeers()['peers'])['channels'][-1]['close_to_addr'] == remote_valid_addr assert only_one(l2.rpc.listpeers()['peers'])['channels'][-1]['close_to_addr'] == remote_valid_addr
# The tx outputs must be one of the two permutations
resp = l2.rpc.close(l1.info['id']) assert _close(l2, l1) in ([addr, remote_valid_addr], [remote_valid_addr, addr])
assert resp['type'] == 'mutual'
vouts = bitcoind.rpc.decoderawtransaction(resp['tx'])['vout']
assert len(vouts) == 2
for vout in vouts:
assert only_one(vout['scriptPubKey']['addresses']) in [addr, remote_valid_addr]
# check that passing in a different addr to close causes an RPC error # check that passing in a different addr to close causes an RPC error
addr2 = l1.rpc.newaddr()['bech32'] addr2 = l1.rpc.newaddr()['bech32']

Loading…
Cancel
Save