Skip to content

Commit

Permalink
tests: Improve p2p tx propagation functional test
Browse files Browse the repository at this point in the history
Reduce the likelihood of false positive failures in the p2p
transaction propagation functional test by waiting up to a
maximum timeout for a transaction to propagate, rather than using a
fixed timeout, to reflect the random delay of Dandelion++ transaction
propagation. This strategy also speeds test execution in cases where
propagation occurs faster than the previously expected fixed delay.
  • Loading branch information
iamamyth committed Feb 2, 2025
1 parent 90359e3 commit f918d48
Showing 1 changed file with 26 additions and 10 deletions.
36 changes: 26 additions & 10 deletions tests/functional_tests/p2p.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,12 +160,11 @@ def test_p2p_reorg(self):

def test_p2p_tx_propagation(self):
print('Testing P2P tx propagation')
daemon2 = Daemon(idx = 2)
daemon3 = Daemon(idx = 3)
daemons = (Daemon(idx = 2), Daemon(idx = 3))

for daemon in [daemon2, daemon3]:
for daemon in daemons:
res = daemon.get_transaction_pool_hashes()
assert not 'tx_hashes' in res or len(res.tx_hashes) == 0
assert len(res.get('tx_hashes', [])) == 0

self.wallet.refresh()
res = self.wallet.get_balance()
Expand All @@ -175,12 +174,29 @@ def test_p2p_tx_propagation(self):
assert len(res.tx_hash) == 32*2
txid = res.tx_hash

time.sleep(5)

for daemon in [daemon2, daemon3]:
res = daemon.get_transaction_pool_hashes()
assert len(res.tx_hashes) == 1
assert res.tx_hashes[0] == txid
# Due to Dandelion++, the network propagates transactions with a
# random delay, so poll for the transaction with a timeout
timeout = 16
pending_daemons = set(daemons)
expected_hashes = [txid]
wait_cutoff = time.monotonic() + timeout
while True:
done = []
for daemon in pending_daemons:
res = daemon.get_transaction_pool_hashes()
hashes = res.get('tx_hashes')
if hashes:
assert hashes == expected_hashes
done.append(daemon)
pending_daemons.difference_update(done)
if len(pending_daemons) == 0:
break
max_delay = wait_cutoff - time.monotonic()
if max_delay <= 0:
break
time.sleep(min(.25, max_delay))
npending = len(pending_daemons)
assert npending == 0, '%d daemons pending' % npending


if __name__ == '__main__':
Expand Down

0 comments on commit f918d48

Please sign in to comment.