Browse Source

Poll on getblocktemplate result rather than use bare sleep to avoid race condition.

pull/4/head
Jay Graber 7 years ago
parent
commit
0a56135336
  1. 31
      qa/rpc-tests/prioritisetransaction.py

31
qa/rpc-tests/prioritisetransaction.py

@ -7,6 +7,8 @@ from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import *
from time import *
from test_framework.mininode import COIN
import time
class PrioritiseTransactionTest (BitcoinTestFramework):
@ -67,7 +69,7 @@ class PrioritiseTransactionTest (BitcoinTestFramework):
self.sync_all()
# Create tx of lower value to be prioritized on node 0
# Older transactions get mined first, so this lower value, newer tx is unlikely to be mined without prioritization
# Older transactions get mined first, so this lower value, newer tx is unlikely to be mined without prioritisation
priority_tx_0 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1)
# Check that priority_tx_0 is not in block_template() prior to prioritisation
@ -79,7 +81,8 @@ class PrioritiseTransactionTest (BitcoinTestFramework):
break
assert_equal(in_block_template, False)
priority_result = self.nodes[0].prioritisetransaction(priority_tx_0, 1000, int(3 * base_fee * COIN))
priority_success = self.nodes[0].prioritisetransaction(priority_tx_0, 1000, int(3 * base_fee * COIN))
assert(priority_success)
# Check that prioritized transaction is not in getblocktemplate()
# (not updated because no new txns)
@ -91,6 +94,7 @@ class PrioritiseTransactionTest (BitcoinTestFramework):
break
assert_equal(in_block_template, False)
# Sending a new transaction will make getblocktemplate refresh within 10s
self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1)
# Check that prioritized transaction is not in getblocktemplate()
@ -103,16 +107,23 @@ class PrioritiseTransactionTest (BitcoinTestFramework):
break
assert_equal(in_block_template, False)
sleep(10)
# Check that prioritized transaction is in getblocktemplate()
in_block_template = False
# getblocktemplate() will refresh after 1 min, or after 10 sec if new transaction is added to mempool
# Mempool is probed every 10 seconds. We'll give getblocktemplate() a maximum of 30 seconds to refresh
block_template = self.nodes[0].getblocktemplate()
for tx in block_template['transactions']:
if tx['hash'] == priority_tx_0:
in_block_template = True
break
assert_equal(in_block_template, True)
start = time.time();
in_block_template = False
while in_block_template == False:
for tx in block_template['transactions']:
if tx['hash'] == priority_tx_0:
in_block_template = True
break
if time.time() - start > 30:
raise AssertionError("Test timed out because prioritised transaction was not returned by getblocktemplate within 30 seconds.")
sleep(1)
block_template = self.nodes[0].getblocktemplate()
assert(in_block_template)
# Node 1 doesn't get the next block, so this *shouldn't* be mined despite being prioritized on node 1
priority_tx_1 = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 0.1)

Loading…
Cancel
Save