Changeset View
Changeset View
Standalone View
Standalone View
test/functional/abc_p2p_sendava.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2022 The Bitcoin developers | # Copyright (c) 2022 The Bitcoin developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test version message behavior""" | """Test version message behavior""" | ||||
from test_framework.avatools import gen_proof | |||||
from test_framework.messages import msg_sendava, msg_version | from test_framework.messages import msg_sendava, msg_version | ||||
from test_framework.p2p import P2P_SUBVERSION, P2PInterface, p2p_lock | from test_framework.p2p import P2P_SUBVERSION, P2PInterface, p2p_lock | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import assert_equal | from test_framework.util import assert_equal | ||||
from test_framework.wallet_util import bytes_to_wif | |||||
# Extracted from version.h | # Extracted from version.h | ||||
SENDAVA_VERSION = 70017 | SENDAVA_VERSION = 70017 | ||||
class CustomVersionP2PInterface(P2PInterface): | class CustomVersionP2PInterface(P2PInterface): | ||||
def __init__(self, version): | def __init__(self, version): | ||||
super().__init__() | super().__init__() | ||||
Show All 27 Lines | def run_test(self): | ||||
node.add_p2p_connection(sendava_version_peer) | node.add_p2p_connection(sendava_version_peer) | ||||
sendava_version_peer.sync_with_ping() | sendava_version_peer.sync_with_ping() | ||||
with p2p_lock: | with p2p_lock: | ||||
assert_equal( | assert_equal( | ||||
sendava_version_peer.message_count.get( | sendava_version_peer.message_count.get( | ||||
"sendava", 0), 0) | "sendava", 0), 0) | ||||
self.restart_node(0, extra_args=['-enableavalanche=1']) | privkey, proof = gen_proof(node) | ||||
self.restart_node(0, extra_args=[ | |||||
'-enableavalanche=1', | |||||
f'-avamasterkey={bytes_to_wif(privkey.get_bytes())}', | |||||
f'-avaproof={proof.serialize().hex()}', | |||||
]) | |||||
low_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION - 1) | low_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION - 1) | ||||
node.add_p2p_connection(low_version_peer) | node.add_outbound_p2p_connection( | ||||
low_version_peer, | |||||
p2p_idx=0, | |||||
) | |||||
low_version_peer.sync_with_ping() | low_version_peer.sync_with_ping() | ||||
with p2p_lock: | with p2p_lock: | ||||
assert_equal(low_version_peer.message_count.get("sendava", 0), 0) | assert_equal(low_version_peer.message_count.get("sendava", 0), 0) | ||||
sendava_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | sendava_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | ||||
node.add_p2p_connection(sendava_version_peer) | node.add_outbound_p2p_connection( | ||||
sendava_version_peer, | |||||
p2p_idx=1, | |||||
) | |||||
sendava_version_peer.wait_until( | sendava_version_peer.wait_until( | ||||
lambda: sendava_version_peer.last_message.get("sendava")) | lambda: sendava_version_peer.last_message.get("sendava")) | ||||
for peer in [low_version_peer, sendava_version_peer]: | |||||
with p2p_lock: | |||||
assert_equal(peer.message_count.get("avahello", 0), 0) | |||||
assert_equal(peer.message_count.get("getavaaddr", 0), 0) | |||||
assert_equal(peer.message_count.get("getavaproofs", 0), 0) | |||||
peer.send_message(msg_sendava()) | |||||
peer.wait_until( | |||||
lambda: | |||||
peer.message_count.get("avahello", 0) > 0 and | |||||
peer.message_count.get("getavaaddr", 0) > 0 and | |||||
peer.message_count.get("getavaproofs", 0) > 0) | |||||
duplicated_sendava_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | duplicated_sendava_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | ||||
node.add_p2p_connection(duplicated_sendava_peer) | node.add_p2p_connection(duplicated_sendava_peer) | ||||
duplicated_sendava_peer.send_message(msg_sendava()) | duplicated_sendava_peer.send_message(msg_sendava()) | ||||
with node.assert_debug_log(["duplicated-sendava"]): | with node.assert_debug_log(["duplicated-sendava"]): | ||||
duplicated_sendava_peer.send_message(msg_sendava()) | duplicated_sendava_peer.send_message(msg_sendava()) | ||||
duplicated_sendava_peer.wait_for_disconnect() | duplicated_sendava_peer.wait_for_disconnect() | ||||
invalid_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | invalid_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | ||||
node.add_p2p_connection(invalid_version_peer) | node.add_p2p_connection(invalid_version_peer) | ||||
with node.assert_debug_log(["invalid-sendava-version"]): | with node.assert_debug_log(["invalid-sendava-version"]): | ||||
invalid_version_peer.send_message(msg_sendava(version=0)) | invalid_version_peer.send_message(msg_sendava(version=0)) | ||||
invalid_version_peer.wait_for_disconnect() | invalid_version_peer.wait_for_disconnect() | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
SendAvaTest().main() | SendAvaTest().main() |