Skip to content

Commit

Permalink
Merge #19781: test: add parameterized constructor for msg_sendcmpct()
Browse files Browse the repository at this point in the history
6384419 test: add parameterized constructor for msg_sendcmpct() (Sebastian Falbesoner)

Pull request description:

  While working on the test for #19776 I noticed that creating a `sendcmpct` message is quite cumbersome -- due to the lack of a parameterized constructor, one needs to create an empty (that is, initialized with default values) object and then set the two fields one by one. This PR replaces the default constructor with a parameterized constructor and uses it in the test `p2p_compactblocks.py`, reducing LOC. No need to pollute the namespace with temporary throw-away message objects anymore.

ACKs for top commit:
  guggero:
    Code review ACK 6384419.
  epson121:
    Code review ACK 6384419

Tree-SHA512: 3b58d276d714b73abc6cc98d1d52dec5f6026b33f03faaeb7dcbc5d83ac377555179f98b159b2b9ecc8957999c35a1dc082e3c69299c5fde4e35f1bd0587ce9d
  • Loading branch information
MarcoFalke committed Sep 20, 2020
2 parents 38fd1bd + 6384419 commit b99a163
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 27 deletions.
31 changes: 7 additions & 24 deletions test/functional/p2p_compactblocks.py
Expand Up @@ -188,28 +188,21 @@ def check_announcement_of_new_block(node, peer, predicate):
test_node.request_headers_and_sync(locator=[tip])

# Now try a SENDCMPCT message with too-high version
sendcmpct = msg_sendcmpct()
sendcmpct.version = preferred_version + 1
sendcmpct.announce = True
test_node.send_and_ping(sendcmpct)
test_node.send_and_ping(msg_sendcmpct(announce=True, version=preferred_version+1))
check_announcement_of_new_block(node, test_node, lambda p: "cmpctblock" not in p.last_message)

# Headers sync before next test.
test_node.request_headers_and_sync(locator=[tip])

# Now try a SENDCMPCT message with valid version, but announce=False
sendcmpct.version = preferred_version
sendcmpct.announce = False
test_node.send_and_ping(sendcmpct)
test_node.send_and_ping(msg_sendcmpct(announce=False, version=preferred_version))
check_announcement_of_new_block(node, test_node, lambda p: "cmpctblock" not in p.last_message)

# Headers sync before next test.
test_node.request_headers_and_sync(locator=[tip])

# Finally, try a SENDCMPCT message with announce=True
sendcmpct.version = preferred_version
sendcmpct.announce = True
test_node.send_and_ping(sendcmpct)
test_node.send_and_ping(msg_sendcmpct(announce=True, version=preferred_version))
check_announcement_of_new_block(node, test_node, lambda p: "cmpctblock" in p.last_message)

# Try one more time (no headers sync should be needed!)
Expand All @@ -220,23 +213,17 @@ def check_announcement_of_new_block(node, peer, predicate):
check_announcement_of_new_block(node, test_node, lambda p: "cmpctblock" in p.last_message)

# Try one more time, after sending a version-1, announce=false message.
sendcmpct.version = preferred_version - 1
sendcmpct.announce = False
test_node.send_and_ping(sendcmpct)
test_node.send_and_ping(msg_sendcmpct(announce=False, version=preferred_version-1))
check_announcement_of_new_block(node, test_node, lambda p: "cmpctblock" in p.last_message)

# Now turn off announcements
sendcmpct.version = preferred_version
sendcmpct.announce = False
test_node.send_and_ping(sendcmpct)
test_node.send_and_ping(msg_sendcmpct(announce=False, version=preferred_version))
check_announcement_of_new_block(node, test_node, lambda p: "cmpctblock" not in p.last_message and "headers" in p.last_message)

if old_node is not None:
# Verify that a peer using an older protocol version can receive
# announcements from this node.
sendcmpct.version = preferred_version - 1
sendcmpct.announce = True
old_node.send_and_ping(sendcmpct)
old_node.send_and_ping(msg_sendcmpct(announce=True, version=preferred_version-1))
# Header sync
old_node.request_headers_and_sync(locator=[tip])
check_announcement_of_new_block(node, old_node, lambda p: "cmpctblock" in p.last_message)
Expand Down Expand Up @@ -729,11 +716,7 @@ def request_cb_announcements(self, peer):
node = self.nodes[0]
tip = node.getbestblockhash()
peer.get_headers(locator=[int(tip, 16)], hashstop=0)

msg = msg_sendcmpct()
msg.version = peer.cmpct_version
msg.announce = True
peer.send_and_ping(msg)
peer.send_and_ping(msg_sendcmpct(announce=True, version=peer.cmpct_version))

def test_compactblock_reconstruction_multiple_peers(self, stalling_peer, delivery_peer):
node = self.nodes[0]
Expand Down
6 changes: 3 additions & 3 deletions test/functional/test_framework/messages.py
Expand Up @@ -1472,9 +1472,9 @@ class msg_sendcmpct:
__slots__ = ("announce", "version")
msgtype = b"sendcmpct"

def __init__(self):
self.announce = False
self.version = 1
def __init__(self, announce=False, version=1):
self.announce = announce
self.version = version

def deserialize(self, f):
self.announce = struct.unpack("<?", f.read(1))[0]
Expand Down

0 comments on commit b99a163

Please sign in to comment.