1#!/usr/bin/env python3
2# Copyright (c) 2020 The Bitcoin Core developers
3# Distributed under the MIT software license, see the accompanying
4# file COPYING or http://www.opensource.org/licenses/mit-license.php.
5"""
6Test addr relay
7"""
8
9from test_framework.messages import (
10    CAddress,
11    NODE_NETWORK,
12    NODE_WITNESS,
13    msg_addr,
14)
15from test_framework.mininode import (
16    P2PInterface,
17)
18from test_framework.test_framework import BitcoinTestFramework
19from test_framework.util import (
20    assert_equal,
21)
22import time
23
24ADDRS = []
25for i in range(10):
26    addr = CAddress()
27    addr.time = int(time.time()) + i
28    addr.nServices = NODE_NETWORK | NODE_WITNESS
29    addr.ip = "123.123.123.{}".format(i % 256)
30    addr.port = 8333 + i
31    ADDRS.append(addr)
32
33
34class AddrReceiver(P2PInterface):
35    def on_addr(self, message):
36        for addr in message.addrs:
37            assert_equal(addr.nServices, 9)
38            assert addr.ip.startswith('123.123.123.')
39            assert (8333 <= addr.port < 8343)
40
41
42class AddrTest(BitcoinTestFramework):
43    def set_test_params(self):
44        self.setup_clean_chain = False
45        self.num_nodes = 1
46
47    def run_test(self):
48        self.log.info('Create connection that sends addr messages')
49        addr_source = self.nodes[0].add_p2p_connection(P2PInterface())
50        msg = msg_addr()
51
52        self.log.info('Send too large addr message')
53        msg.addrs = ADDRS * 101
54        with self.nodes[0].assert_debug_log(['message addr size() = 1010']):
55            addr_source.send_and_ping(msg)
56
57        self.log.info('Check that addr message content is relayed and added to addrman')
58        addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver())
59        msg.addrs = ADDRS
60        with self.nodes[0].assert_debug_log([
61                'Added 10 addresses from 127.0.0.1: 0 tried',
62                'received: addr (301 bytes) peer=0',
63                'sending addr (301 bytes) peer=1',
64        ]):
65            addr_source.send_and_ping(msg)
66            self.nodes[0].setmocktime(int(time.time()) + 30 * 60)
67            addr_receiver.sync_with_ping()
68
69
70if __name__ == '__main__':
71    AddrTest().main()
72