Browse Source

[tests] sync_with_ping should assert that ping hasn't timed out

sync_with_ping currently returns false if the timeout expires, and it is
the caller's responsibility to fail the test. However, none of the tests
currently assert on sync_with_ping()'s return code. This commit adds an
assert to sync_with_ping so the test will fail if the timeout expires.

This commit also removes all the duplicate implementations of
sync_with_ping() from the individual tests.
0.15
John Newbery 8 years ago
parent
commit
6a18bb9a36
  1. 3
      test/functional/assumevalid.py
  2. 9
      test/functional/maxuploadtarget.py
  3. 15
      test/functional/p2p-acceptblock.py
  4. 9
      test/functional/p2p-mempool.py
  5. 21
      test/functional/p2p-segwit.py
  6. 15
      test/functional/p2p-versionbits-warning.py
  7. 5
      test/functional/test_framework/mininode.py

3
test/functional/assumevalid.py

@ -190,7 +190,8 @@ class AssumeValidTest(BitcoinTestFramework):
# Send all blocks to node1. All blocks will be accepted. # Send all blocks to node1. All blocks will be accepted.
for i in range(2202): for i in range(2202):
node1.send_message(msg_block(self.blocks[i])) node1.send_message(msg_block(self.blocks[i]))
node1.sync_with_ping() # make sure the most recent block is synced # Syncing 2200 blocks can take a while on slow systems. Give it plenty of time to sync.
node1.sync_with_ping(120)
assert_equal(self.nodes[1].getblock(self.nodes[1].getbestblockhash())['height'], 2202) assert_equal(self.nodes[1].getblock(self.nodes[1].getbestblockhash())['height'], 2202)
# Send blocks to node2. Block 102 will be rejected. # Send blocks to node2. Block 102 will be rejected.

9
test/functional/maxuploadtarget.py

@ -68,15 +68,6 @@ class TestNode(NodeConnCB):
def on_close(self, conn): def on_close(self, conn):
self.peer_disconnected = True self.peer_disconnected = True
# Sync up with the node after delivery of a block
def sync_with_ping(self, timeout=30):
def received_pong():
return (self.last_pong.nonce == self.ping_counter)
self.connection.send_message(msg_ping(nonce=self.ping_counter))
success = wait_until(received_pong, timeout=timeout)
self.ping_counter += 1
return success
class MaxUploadTest(BitcoinTestFramework): class MaxUploadTest(BitcoinTestFramework):
def __init__(self): def __init__(self):

15
test/functional/p2p-acceptblock.py

@ -88,21 +88,6 @@ class TestNode(NodeConnCB):
def on_pong(self, conn, message): def on_pong(self, conn, message):
self.last_pong = message self.last_pong = message
# Sync up with the node after delivery of a block
def sync_with_ping(self, timeout=30):
self.connection.send_message(msg_ping(nonce=self.ping_counter))
received_pong = False
sleep_time = 0.05
while not received_pong and timeout > 0:
time.sleep(sleep_time)
timeout -= sleep_time
with mininode_lock:
if self.last_pong.nonce == self.ping_counter:
received_pong = True
self.ping_counter += 1
return received_pong
class AcceptBlockTest(BitcoinTestFramework): class AcceptBlockTest(BitcoinTestFramework):
def add_options(self, parser): def add_options(self, parser):
parser.add_option("--testbinary", dest="testbinary", parser.add_option("--testbinary", dest="testbinary",

9
test/functional/p2p-mempool.py

@ -62,15 +62,6 @@ class TestNode(NodeConnCB):
def on_close(self, conn): def on_close(self, conn):
self.peer_disconnected = True self.peer_disconnected = True
# Sync up with the node after delivery of a block
def sync_with_ping(self, timeout=30):
def received_pong():
return (self.last_pong.nonce == self.ping_counter)
self.connection.send_message(msg_ping(nonce=self.ping_counter))
success = wait_until(received_pong, timeout=timeout)
self.ping_counter += 1
return success
def send_mempool(self): def send_mempool(self):
self.lastInv = [] self.lastInv = []
self.send_message(msg_mempool()) self.send_message(msg_mempool())

21
test/functional/p2p-segwit.py

@ -80,13 +80,6 @@ class TestNode(NodeConnCB):
timeout -= self.sleep_time timeout -= self.sleep_time
raise AssertionError("Sync failed to complete") raise AssertionError("Sync failed to complete")
def sync_with_ping(self, timeout=60):
self.send_message(msg_ping(nonce=self.ping_counter))
test_function = lambda: self.last_pong.nonce == self.ping_counter
self.sync(test_function, timeout)
self.ping_counter += 1
return
def wait_for_block(self, blockhash, timeout=60): def wait_for_block(self, blockhash, timeout=60):
test_function = lambda: self.last_block != None and self.last_block.sha256 == blockhash test_function = lambda: self.last_block != None and self.last_block.sha256 == blockhash
self.sync(test_function, timeout) self.sync(test_function, timeout)
@ -148,7 +141,7 @@ class TestNode(NodeConnCB):
if with_witness: if with_witness:
tx_message = msg_witness_tx(tx) tx_message = msg_witness_tx(tx)
self.send_message(tx_message) self.send_message(tx_message)
self.sync_with_ping() self.sync_with_ping(60)
assert_equal(tx.hash in self.connection.rpc.getrawmempool(), accepted) assert_equal(tx.hash in self.connection.rpc.getrawmempool(), accepted)
if (reason != None and not accepted): if (reason != None and not accepted):
# Check the rejection reason as well. # Check the rejection reason as well.
@ -161,7 +154,7 @@ class TestNode(NodeConnCB):
self.send_message(msg_witness_block(block)) self.send_message(msg_witness_block(block))
else: else:
self.send_message(msg_block(block)) self.send_message(msg_block(block))
self.sync_with_ping() self.sync_with_ping(60)
assert_equal(self.connection.rpc.getbestblockhash() == block.hash, accepted) assert_equal(self.connection.rpc.getbestblockhash() == block.hash, accepted)
@ -235,7 +228,7 @@ class SegWitTest(BitcoinTestFramework):
block = self.build_next_block(nVersion=1) block = self.build_next_block(nVersion=1)
block.solve() block.solve()
self.test_node.send_message(msg_block(block)) self.test_node.send_message(msg_block(block))
self.test_node.sync_with_ping() # make sure the block was processed self.test_node.sync_with_ping(60) # make sure the block was processed
txid = block.vtx[0].sha256 txid = block.vtx[0].sha256
self.nodes[0].generate(99) # let the block mature self.nodes[0].generate(99) # let the block mature
@ -251,7 +244,7 @@ class SegWitTest(BitcoinTestFramework):
assert_equal(msg_tx(tx).serialize(), msg_witness_tx(tx).serialize()) assert_equal(msg_tx(tx).serialize(), msg_witness_tx(tx).serialize())
self.test_node.send_message(msg_witness_tx(tx)) self.test_node.send_message(msg_witness_tx(tx))
self.test_node.sync_with_ping() # make sure the tx was processed self.test_node.sync_with_ping(60) # make sure the tx was processed
assert(tx.hash in self.nodes[0].getrawmempool()) assert(tx.hash in self.nodes[0].getrawmempool())
# Save this transaction for later # Save this transaction for later
self.utxo.append(UTXO(tx.sha256, 0, 49*100000000)) self.utxo.append(UTXO(tx.sha256, 0, 49*100000000))
@ -291,7 +284,7 @@ class SegWitTest(BitcoinTestFramework):
# But it should not be permanently marked bad... # But it should not be permanently marked bad...
# Resend without witness information. # Resend without witness information.
self.test_node.send_message(msg_block(block)) self.test_node.send_message(msg_block(block))
self.test_node.sync_with_ping() self.test_node.sync_with_ping(60)
assert_equal(self.nodes[0].getbestblockhash(), block.hash) assert_equal(self.nodes[0].getbestblockhash(), block.hash)
sync_blocks(self.nodes) sync_blocks(self.nodes)
@ -1257,7 +1250,7 @@ class SegWitTest(BitcoinTestFramework):
# Spending a higher version witness output is not allowed by policy, # Spending a higher version witness output is not allowed by policy,
# even with fRequireStandard=false. # even with fRequireStandard=false.
self.test_node.test_transaction_acceptance(tx3, with_witness=True, accepted=False) self.test_node.test_transaction_acceptance(tx3, with_witness=True, accepted=False)
self.test_node.sync_with_ping() self.test_node.sync_with_ping(60)
with mininode_lock: with mininode_lock:
assert(b"reserved for soft-fork upgrades" in self.test_node.last_reject.reason) assert(b"reserved for soft-fork upgrades" in self.test_node.last_reject.reason)
@ -1387,7 +1380,7 @@ class SegWitTest(BitcoinTestFramework):
for i in range(NUM_TESTS): for i in range(NUM_TESTS):
# Ping regularly to keep the connection alive # Ping regularly to keep the connection alive
if (not i % 100): if (not i % 100):
self.test_node.sync_with_ping() self.test_node.sync_with_ping(60)
# Choose random number of inputs to use. # Choose random number of inputs to use.
num_inputs = random.randint(1, 10) num_inputs = random.randint(1, 10)
# Create a slight bias for producing more utxos # Create a slight bias for producing more utxos

15
test/functional/p2p-versionbits-warning.py

@ -46,21 +46,6 @@ class TestNode(NodeConnCB):
def on_pong(self, conn, message): def on_pong(self, conn, message):
self.last_pong = message self.last_pong = message
# Sync up with the node after delivery of a block
def sync_with_ping(self, timeout=30):
self.connection.send_message(msg_ping(nonce=self.ping_counter))
received_pong = False
sleep_time = 0.05
while not received_pong and timeout > 0:
time.sleep(sleep_time)
timeout -= sleep_time
with mininode_lock:
if self.last_pong.nonce == self.ping_counter:
received_pong = True
self.ping_counter += 1
return received_pong
class VersionBitsWarningTest(BitcoinTestFramework): class VersionBitsWarningTest(BitcoinTestFramework):
def __init__(self): def __init__(self):
super().__init__() super().__init__()

5
test/functional/test_framework/mininode.py

@ -1563,11 +1563,14 @@ class NodeConnCB(object):
self.sync_with_ping() self.sync_with_ping()
# Sync up with the node # Sync up with the node
def sync_with_ping(self, timeout=30): def sync_with_ping(self, timeout=60):
def received_pong(): def received_pong():
return (self.last_pong.nonce == self.ping_counter) return (self.last_pong.nonce == self.ping_counter)
self.send_message(msg_ping(nonce=self.ping_counter)) self.send_message(msg_ping(nonce=self.ping_counter))
success = wait_until(received_pong, timeout=timeout) success = wait_until(received_pong, timeout=timeout)
if not success:
logger.error("sync_with_ping failed!")
raise AssertionError("sync_with_ping failed!")
self.ping_counter += 1 self.ping_counter += 1
return success return success

Loading…
Cancel
Save