Changeset View
Changeset View
Standalone View
Standalone View
test/functional/abc_p2p_sendava.py
- This file was added.
Property | Old Value | New Value |
---|---|---|
File Mode | null | 100755 |
#!/usr/bin/env python3 | |||||
# Copyright (c) 2022 The Bitcoin developers | |||||
# Distributed under the MIT software license, see the accompanying | |||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | |||||
"""Test version message behavior""" | |||||
from test_framework.messages import msg_sendava, msg_version | |||||
from test_framework.p2p import P2P_SUBVERSION, P2PInterface, p2p_lock | |||||
from test_framework.test_framework import BitcoinTestFramework | |||||
from test_framework.util import assert_equal | |||||
# Extracted from version.h | |||||
SENDAVA_VERSION = 70017 | |||||
class CustomVersionP2PInterface(P2PInterface): | |||||
def __init__(self, version): | |||||
super().__init__() | |||||
self.version = version | |||||
def peer_connect_send_version(self, services): | |||||
# Send version message with custom version | |||||
vt = msg_version() | |||||
vt.nVersion = self.version | |||||
vt.strSubVer = P2P_SUBVERSION | |||||
vt.nServices = services | |||||
vt.addrTo.ip = self.dstaddr | |||||
vt.addrTo.port = self.dstport | |||||
vt.addrFrom.ip = "0.0.0.0" | |||||
vt.addrFrom.port = 0 | |||||
# Will be sent right after connection_made | |||||
self.on_connection_send_msg = vt | |||||
class SendAvaTest(BitcoinTestFramework): | |||||
def set_test_params(self): | |||||
self.num_nodes = 1 | |||||
def run_test(self): | |||||
node = self.nodes[0] | |||||
self.log.info("sendava message is only sent if avalanche is enabled") | |||||
sendava_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | |||||
node.add_p2p_connection(sendava_version_peer) | |||||
sendava_version_peer.sync_with_ping() | |||||
with p2p_lock: | |||||
assert_equal( | |||||
sendava_version_peer.message_count.get( | |||||
"sendava", 0), 0) | |||||
self.restart_node(0, extra_args=['-enableavalanche=1']) | |||||
low_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION - 1) | |||||
node.add_p2p_connection(low_version_peer) | |||||
low_version_peer.sync_with_ping() | |||||
with p2p_lock: | |||||
assert_equal(low_version_peer.message_count.get("sendava", 0), 0) | |||||
sendava_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | |||||
node.add_p2p_connection(sendava_version_peer) | |||||
sendava_version_peer.wait_until( | |||||
lambda: sendava_version_peer.last_message.get("sendava")) | |||||
duplicated_sendava_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | |||||
node.add_p2p_connection(duplicated_sendava_peer) | |||||
duplicated_sendava_peer.send_message(msg_sendava()) | |||||
with node.assert_debug_log(["duplicated-sendava"]): | |||||
duplicated_sendava_peer.send_message(msg_sendava()) | |||||
duplicated_sendava_peer.wait_for_disconnect() | |||||
invalid_version_peer = CustomVersionP2PInterface(SENDAVA_VERSION) | |||||
node.add_p2p_connection(invalid_version_peer) | |||||
with node.assert_debug_log(["invalid-sendava-version"]): | |||||
invalid_version_peer.send_message(msg_sendava(version=0)) | |||||
invalid_version_peer.wait_for_disconnect() | |||||
if __name__ == '__main__': | |||||
SendAvaTest().main() |