Skip to content

Commit 5ff3d1e

Browse files
committed
Merge bitcoin/bitcoin#24269: test: add functional test for -discover
bff05bd test: add functional test for -discover (brunoerg) Pull request description: This PR adds a functional test for `-discover`. It tests different scenarios where `localaddresses` should be empty or may contain the addresses. Obs: `localaddresses` is not always accurate, so it's not possible to ensure (100%) it will contain any addresses. https://github.com/bitcoin/bitcoin/blob/515200298b555845696a07ae2bc0a84a5dd02ae4/src/init.cpp#L449 Obs: See #24258 - It adds test coverage for this field but for nodes with proxy. ACKs for top commit: mzumsande: Code review ACK bff05bd achow101: ACK bff05bd rajarshimaitra: tACK bff05bd Tree-SHA512: 8782497c146bce1ba86fda6146f3847465d7069f2cb6b84f2afc8f3b43efa813442bffe7447e9ce02adee304100b60365409bf0e5d875dfb880038442feec2a6
2 parents 1dec90d + bff05bd commit 5ff3d1e

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

test/functional/feature_discover.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#!/usr/bin/env python3
2+
# Copyright (c) 2022 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().main()

test/functional/test_runner.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@
277277
'feature_dersig.py',
278278
'feature_cltv.py',
279279
'rpc_uptime.py',
280+
'feature_discover.py',
280281
'wallet_resendwallettransactions.py --legacy-wallet',
281282
'wallet_resendwallettransactions.py --descriptors',
282283
'wallet_fallbackfee.py --legacy-wallet',

0 commit comments

Comments
 (0)