Skip to content

Commit

Permalink
Merge #11712: [tests] Split NodeConn from NodeConnCB
Browse files Browse the repository at this point in the history
e9dfa9b [tests] Move version message sending from NodeConn to NodeConnCB (John Newbery)
dad596f [tests] Make NodeConnCB a subclass of NodeConn (John Newbery)
e30d404 [tests] Move only: move NodeConnCB below NodeConn (John Newbery)
4d50598 [tests] Tidy up mininode (John Newbery)
f2ae6f3 [tests] Remove mininode periodic (half-hour) ping messages (John Newbery)
ec59523 [tests] Remove rpc property from TestNode in p2p-segwit.py. (John Newbery)

Pull request description:

  This is the final step in #11518, except for possibly renaming - for motivation, please see that PR.

  If this is merged, then migrating the test framework from asyncore to asyncio should be easier (I say should because I haven't dug too deeply into what would be required).

  Requesting review from @ryanofsky , since he always has good feedback on these refactor PRs, and I'd appreciate his take on this refactor. Note particularly that I've reverted the change suggested here: #11182 (comment) . The idea, as always, is to present a simple interface to the test writer.

Tree-SHA512: 94dd467a13ec799b101108cf47d4dccb6f6240b601e375e3d785313333bbb389c26072a50759aca663bbf3d6c8b867b99e36ae8800ab8ea115e0496c151926ce
  • Loading branch information
MarcoFalke committed Nov 29, 2017
2 parents 32c9b57 + e9dfa9b commit 9f2c2db
Show file tree
Hide file tree
Showing 14 changed files with 452 additions and 434 deletions.
2 changes: 1 addition & 1 deletion test/functional/assumevalid.py
Expand Up @@ -67,7 +67,7 @@ def setup_network(self):
def send_blocks_until_disconnected(self, p2p_conn):
"""Keep sending blocks to the node until we're disconnected."""
for i in range(len(self.blocks)):
if not p2p_conn.connection:
if p2p_conn.state != "connected":
break
try:
p2p_conn.send_message(msg_block(self.blocks[i]))
Expand Down
2 changes: 1 addition & 1 deletion test/functional/bip9-softforks.py
Expand Up @@ -246,7 +246,7 @@ def test_BIP(self, bipName, activated_version, invalidate, invalidatePostSignatu
self.setup_network()
self.test.add_all_connections(self.nodes)
NetworkThread().start()
self.test.test_nodes[0].wait_for_verack()
self.test.p2p_connections[0].wait_for_verack()

def get_tests(self):
for test in itertools.chain(
Expand Down
4 changes: 2 additions & 2 deletions test/functional/example_test.py
Expand Up @@ -49,14 +49,14 @@ def __init__(self):
# Stores a dictionary of all blocks received
self.block_receive_map = defaultdict(int)

def on_block(self, conn, message):
def on_block(self, message):
"""Override the standard on_block callback
Store the hash of a received block in the dictionary."""
message.block.calc_sha256()
self.block_receive_map[message.block.sha256] += 1

def on_inv(self, conn, message):
def on_inv(self, message):
"""Override the standard on_inv callback"""
pass

Expand Down
4 changes: 2 additions & 2 deletions test/functional/maxuploadtarget.py
Expand Up @@ -22,10 +22,10 @@ def __init__(self):
super().__init__()
self.block_receive_map = defaultdict(int)

def on_inv(self, conn, message):
def on_inv(self, message):
pass

def on_block(self, conn, message):
def on_block(self, message):
message.block.calc_sha256()
self.block_receive_map[message.block.sha256] += 1

Expand Down
12 changes: 6 additions & 6 deletions test/functional/p2p-compactblocks.py
Expand Up @@ -25,21 +25,21 @@ def __init__(self):
# so we can eg wait until a particular block is announced.
self.announced_blockhashes = set()

def on_sendcmpct(self, conn, message):
def on_sendcmpct(self, message):
self.last_sendcmpct.append(message)

def on_cmpctblock(self, conn, message):
def on_cmpctblock(self, message):
self.block_announced = True
self.last_message["cmpctblock"].header_and_shortids.header.calc_sha256()
self.announced_blockhashes.add(self.last_message["cmpctblock"].header_and_shortids.header.sha256)

def on_headers(self, conn, message):
def on_headers(self, message):
self.block_announced = True
for x in self.last_message["headers"].headers:
x.calc_sha256()
self.announced_blockhashes.add(x.sha256)

def on_inv(self, conn, message):
def on_inv(self, message):
for x in self.last_message["inv"].inv:
if x.type == 2:
self.block_announced = True
Expand All @@ -60,7 +60,7 @@ def get_headers(self, locator, hashstop):
msg = msg_getheaders()
msg.locator.vHave = locator
msg.hashstop = hashstop
self.connection.send_message(msg)
self.send_message(msg)

def send_header_for_blocks(self, new_blocks):
headers_message = msg_headers()
Expand All @@ -86,7 +86,7 @@ def send_await_disconnect(self, message, timeout=30):
This is used when we want to send a message into the node that we expect
will get us disconnected, eg an invalid block."""
self.send_message(message)
wait_until(lambda: not self.connected, timeout=timeout, lock=mininode_lock)
wait_until(lambda: self.state != "connected", timeout=timeout, lock=mininode_lock)

class CompactBlocksTest(BitcoinTestFramework):
def set_test_params(self):
Expand Down
2 changes: 1 addition & 1 deletion test/functional/p2p-feefilter.py
Expand Up @@ -27,7 +27,7 @@ def __init__(self):
super().__init__()
self.txinvs = []

def on_inv(self, conn, message):
def on_inv(self, message):
for i in message.inv:
if (i.type == 1):
self.txinvs.append(hashToHex(i.hash))
Expand Down
67 changes: 33 additions & 34 deletions test/functional/p2p-leaktests.py
Expand Up @@ -30,43 +30,42 @@ def bad_message(self, message):
self.unexpected_msg = True
self.log.info("should not have received message: %s" % message.command)

def on_open(self, conn):
self.connected = True
def on_open(self):
self.ever_connected = True

def on_version(self, conn, message): self.bad_message(message)
def on_verack(self, conn, message): self.bad_message(message)
def on_reject(self, conn, message): self.bad_message(message)
def on_inv(self, conn, message): self.bad_message(message)
def on_addr(self, conn, message): self.bad_message(message)
def on_getdata(self, conn, message): self.bad_message(message)
def on_getblocks(self, conn, message): self.bad_message(message)
def on_tx(self, conn, message): self.bad_message(message)
def on_block(self, conn, message): self.bad_message(message)
def on_getaddr(self, conn, message): self.bad_message(message)
def on_headers(self, conn, message): self.bad_message(message)
def on_getheaders(self, conn, message): self.bad_message(message)
def on_ping(self, conn, message): self.bad_message(message)
def on_mempool(self, conn): self.bad_message(message)
def on_pong(self, conn, message): self.bad_message(message)
def on_feefilter(self, conn, message): self.bad_message(message)
def on_sendheaders(self, conn, message): self.bad_message(message)
def on_sendcmpct(self, conn, message): self.bad_message(message)
def on_cmpctblock(self, conn, message): self.bad_message(message)
def on_getblocktxn(self, conn, message): self.bad_message(message)
def on_blocktxn(self, conn, message): self.bad_message(message)
def on_version(self, message): self.bad_message(message)
def on_verack(self, message): self.bad_message(message)
def on_reject(self, message): self.bad_message(message)
def on_inv(self, message): self.bad_message(message)
def on_addr(self, message): self.bad_message(message)
def on_getdata(self, message): self.bad_message(message)
def on_getblocks(self, message): self.bad_message(message)
def on_tx(self, message): self.bad_message(message)
def on_block(self, message): self.bad_message(message)
def on_getaddr(self, message): self.bad_message(message)
def on_headers(self, message): self.bad_message(message)
def on_getheaders(self, message): self.bad_message(message)
def on_ping(self, message): self.bad_message(message)
def on_mempool(self, message): self.bad_message(message)
def on_pong(self, message): self.bad_message(message)
def on_feefilter(self, message): self.bad_message(message)
def on_sendheaders(self, message): self.bad_message(message)
def on_sendcmpct(self, message): self.bad_message(message)
def on_cmpctblock(self, message): self.bad_message(message)
def on_getblocktxn(self, message): self.bad_message(message)
def on_blocktxn(self, message): self.bad_message(message)

# Node that never sends a version. We'll use this to send a bunch of messages
# anyway, and eventually get disconnected.
class CNodeNoVersionBan(CLazyNode):
# send a bunch of veracks without sending a message. This should get us disconnected.
# NOTE: implementation-specific check here. Remove if bitcoind ban behavior changes
def on_open(self, conn):
super().on_open(conn)
def on_open(self):
super().on_open()
for i in range(banscore):
self.send_message(msg_verack())

def on_reject(self, conn, message): pass
def on_reject(self, message): pass

# Node that never sends a version. This one just sits idle and hopes to receive
# any message (it shouldn't!)
Expand All @@ -80,15 +79,15 @@ def __init__(self):
self.version_received = False
super().__init__()

def on_reject(self, conn, message): pass
def on_verack(self, conn, message): pass
def on_reject(self, message): pass
def on_verack(self, message): pass
# When version is received, don't reply with a verack. Instead, see if the
# node will give us a message that it shouldn't. This is not an exhaustive
# list!
def on_version(self, conn, message):
def on_version(self, message):
self.version_received = True
conn.send_message(msg_ping())
conn.send_message(msg_getaddr())
self.send_message(msg_ping())
self.send_message(msg_getaddr())

class P2PLeakTest(BitcoinTestFramework):
def set_test_params(self):
Expand Down Expand Up @@ -119,11 +118,11 @@ def run_test(self):
time.sleep(5)

#This node should have been banned
assert not no_version_bannode.connected
assert no_version_bannode.state != "connected"

# These nodes should have been disconnected
assert not unsupported_service_bit5_node.connected
assert not unsupported_service_bit7_node.connected
assert unsupported_service_bit5_node.state != "connected"
assert unsupported_service_bit7_node.state != "connected"

self.nodes[0].disconnect_p2ps()

Expand Down

0 comments on commit 9f2c2db

Please sign in to comment.