feature_discover.py raw
1 #!/usr/bin/env python3
2 # Copyright (c) 2022-present 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 """Test -discover command."""
6
7 import socket
8
9 from test_framework.test_framework import BitcoinTestFramework
10 from test_framework.util import assert_equal
11
12
13 def is_valid_ipv4_address(address):
14 try:
15 socket.inet_aton(address)
16 except socket.error:
17 return False
18 return True
19
20
21 def is_valid_ipv6_address(address):
22 try:
23 socket.inet_pton(socket.AF_INET6, address)
24 except socket.error:
25 return False
26 return True
27
28
29 class DiscoverTest(BitcoinTestFramework):
30 def set_test_params(self):
31 self.setup_clean_chain = True
32 self.bind_to_localhost_only = False
33 self.num_nodes = 1
34
35 def validate_addresses(self, addresses_obj):
36 for address_obj in addresses_obj:
37 address = address_obj['address']
38 self.log.info(f"Validating {address}")
39 valid = (is_valid_ipv4_address(address)
40 or is_valid_ipv6_address(address))
41 assert_equal(valid, True)
42
43 def test_local_addresses(self, test_case, *, expect_empty=False):
44 self.log.info(f"Restart node with {test_case}")
45 self.restart_node(0, test_case)
46 network_info = self.nodes[0].getnetworkinfo()
47 network_enabled = [n for n in network_info['networks']
48 if n['reachable'] and n['name'] in ['ipv4', 'ipv6']]
49 local_addrs = list(network_info["localaddresses"])
50 if expect_empty or not network_enabled:
51 assert_equal(local_addrs, [])
52 elif len(local_addrs) > 0:
53 self.validate_addresses(local_addrs)
54
55 def run_test(self):
56 test_cases = [
57 ["-listen", "-discover"],
58 ["-discover"],
59 ]
60
61 test_cases_empty = [
62 ["-discover=0"],
63 ["-listen", "-discover=0"],
64 [],
65 ]
66
67 for test_case in test_cases:
68 self.test_local_addresses(test_case, expect_empty=False)
69
70 for test_case in test_cases_empty:
71 self.test_local_addresses(test_case, expect_empty=True)
72
73
74 if __name__ == '__main__':
75 DiscoverTest(__file__).main()
76