Skip to content

Commit 2056387

Browse files
committed
run dag connection test
1 parent 7d1d54f commit 2056387

File tree

4 files changed

+31
-112
lines changed

4 files changed

+31
-112
lines changed

.github/workflows/test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
strategy:
3131
matrix:
3232
# test: [scenarios_test.py, rpc_test.py, graph_test.py, ln_test.py, dag_connection_test.py, logging_test.py]
33-
test: [scenarios_test.py, rpc_test.py, graph_test.py, logging_test.py]
33+
test: [scenarios_test.py, rpc_test.py, graph_test.py, dag_connection_test.py, logging_test.py]
3434
steps:
3535
- uses: actions/checkout@v4
3636
- uses: azure/[email protected]

resources/images/commander/src/commander.py

+13-61
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ def setup(self):
9393
cwd=self.options.tmpdir,
9494
coverage_dir=self.options.coveragedir,
9595
)
96+
node.tank = tank["tank"]
9697
node.rpc = get_rpc_proxy(
9798
f"http://{tank['rpc_user']}:{tank['rpc_password']}@{tank['rpc_host']}:{tank['rpc_port']}",
9899
i,
@@ -292,6 +293,7 @@ def parse_args(self):
292293

293294
PortSeed.n = self.options.port_seed
294295

296+
295297
def connect_nodes(self, a, b, *, peer_advertises_v2=None, wait_for_connect: bool = True):
296298
"""
297299
Kwargs:
@@ -302,83 +304,33 @@ def connect_nodes(self, a, b, *, peer_advertises_v2=None, wait_for_connect: bool
302304
"""
303305
from_connection = self.nodes[a]
304306
to_connection = self.nodes[b]
305-
306-
to_ip_port = self.warnet.tanks[b].get_dns_addr()
307-
from_ip_port = self.warnet.tanks[a].get_ip_addr()
307+
from_num_peers = 1 + len(from_connection.getpeerinfo())
308+
to_num_peers = 1 + len(to_connection.getpeerinfo())
309+
ip_port = self.nodes[b].rpchost + ":18444"
308310

309311
if peer_advertises_v2 is None:
310312
peer_advertises_v2 = self.options.v2transport
311313

312314
if peer_advertises_v2:
313-
from_connection.addnode(node=to_ip_port, command="onetry", v2transport=True)
315+
from_connection.addnode(node=ip_port, command="onetry", v2transport=True)
314316
else:
315317
# skip the optional third argument (default false) for
316318
# compatibility with older clients
317-
from_connection.addnode(to_ip_port, "onetry")
319+
from_connection.addnode(ip_port, "onetry")
318320

319321
if not wait_for_connect:
320322
return
321323

322-
def get_peer_ip(peer):
323-
try: # we encounter a regular ip address
324-
ip_addr = str(ipaddress.ip_address(peer["addr"].split(":")[0]))
325-
return ip_addr
326-
except ValueError as err: # or we encounter a service name
327-
try:
328-
# NETWORK-tank-TANK_INDEX-service
329-
# NETWORK-test-TEST-tank-TANK_INDEX-service
330-
tank_index = int(peer["addr"].split("-")[-2])
331-
except (ValueError, IndexError) as inner_err:
332-
raise ValueError(
333-
"could not derive tank index from service name: {} {}".format(
334-
peer["addr"], inner_err
335-
)
336-
) from err
337-
338-
ip_addr = self.warnet.tanks[tank_index].get_ip_addr()
339-
return ip_addr
340-
341324
# poll until version handshake complete to avoid race conditions
342325
# with transaction relaying
343326
# See comments in net_processing:
344327
# * Must have a version message before anything else
345328
# * Must have a verack message before anything else
346-
self.wait_until(
347-
lambda: any(
348-
peer["addr"] == to_ip_port and peer["version"] != 0
349-
for peer in from_connection.getpeerinfo()
350-
)
351-
)
352-
self.wait_until(
353-
lambda: any(
354-
get_peer_ip(peer) == from_ip_port and peer["version"] != 0
355-
for peer in to_connection.getpeerinfo()
356-
)
357-
)
358-
self.wait_until(
359-
lambda: any(
360-
peer["addr"] == to_ip_port and peer["bytesrecv_per_msg"].pop("verack", 0) >= 21
361-
for peer in from_connection.getpeerinfo()
362-
)
363-
)
364-
self.wait_until(
365-
lambda: any(
366-
get_peer_ip(peer) == from_ip_port
367-
and peer["bytesrecv_per_msg"].pop("verack", 0) >= 21
368-
for peer in to_connection.getpeerinfo()
369-
)
370-
)
329+
self.wait_until(lambda: sum(peer['version'] != 0 for peer in from_connection.getpeerinfo()) == from_num_peers)
330+
self.wait_until(lambda: sum(peer['version'] != 0 for peer in to_connection.getpeerinfo()) == to_num_peers)
331+
self.wait_until(lambda: sum(peer['bytesrecv_per_msg'].pop('verack', 0) >= 21 for peer in from_connection.getpeerinfo()) == from_num_peers)
332+
self.wait_until(lambda: sum(peer['bytesrecv_per_msg'].pop('verack', 0) >= 21 for peer in to_connection.getpeerinfo()) == to_num_peers)
371333
# The message bytes are counted before processing the message, so make
372334
# sure it was fully processed by waiting for a ping.
373-
self.wait_until(
374-
lambda: any(
375-
peer["addr"] == to_ip_port and peer["bytesrecv_per_msg"].pop("pong", 0) >= 29
376-
for peer in from_connection.getpeerinfo()
377-
)
378-
)
379-
self.wait_until(
380-
lambda: any(
381-
get_peer_ip(peer) == from_ip_port and peer["bytesrecv_per_msg"].pop("pong", 0) >= 29
382-
for peer in to_connection.getpeerinfo()
383-
)
384-
)
335+
self.wait_until(lambda: sum(peer["bytesrecv_per_msg"].pop("pong", 0) >= 29 for peer in from_connection.getpeerinfo()) == from_num_peers)
336+
self.wait_until(lambda: sum(peer["bytesrecv_per_msg"].pop("pong", 0) >= 29 for peer in to_connection.getpeerinfo()) == to_num_peers)

test/dag_connection_test.py

-15
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ def run_test(self):
1717
try:
1818
self.setup_network()
1919
self.run_connect_dag_scenario()
20-
self.run_connect_dag_scenario_post_connection()
2120
finally:
2221
self.stop_server()
2322

@@ -29,22 +28,8 @@ def setup_network(self):
2928

3029
def run_connect_dag_scenario(self):
3130
self.log.info("Running connect_dag scenario")
32-
self.log_expected_msgs = [
33-
"Successfully ran the connect_dag.py scenario using a temporary file"
34-
]
35-
self.log_unexpected_msgs = ["Test failed."]
3631
self.warcli("scenarios run-file test/data/scenario_connect_dag.py")
3732
self.wait_for_all_scenarios()
38-
self.assert_log_msgs()
39-
40-
def run_connect_dag_scenario_post_connection(self):
41-
self.log.info("Running connect_dag scenario")
42-
self.log_expected_msgs = ["Successfully ran the connect_dag.py scenario"]
43-
self.log_unexpected_msgs = ["Test failed"]
44-
self.warcli("scenarios run-file test/data/scenario_connect_dag.py")
45-
self.wait_for_all_scenarios()
46-
self.assert_log_msgs()
47-
4833

4934
if __name__ == "__main__":
5035
test = DAGConnectionTest()

test/data/scenario_connect_dag.py

+17-35
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,7 @@ def set_test_params(self):
2323
# This is just a minimum
2424
self.num_nodes = 10
2525

26-
def add_options(self, parser):
27-
parser.add_argument(
28-
"--network_name",
29-
dest="network_name",
30-
default="warnet",
31-
help="",
32-
)
33-
3426
def run_test(self):
35-
while not self.warnet.network_connected():
36-
sleep(1)
37-
3827
# All permutations of a directed acyclic graph with zero, one, or two inputs/outputs
3928
#
4029
# │ Node │ In │ Out │ Con In │ Con Out │
@@ -66,12 +55,6 @@ def run_test(self):
6655
self.connect_nodes(5, 4)
6756
self.connect_nodes(5, 6)
6857
self.connect_nodes(6, 7)
69-
70-
# Nodes 8 & 9 shall come pre-connected. Attempt to connect them anyway to test the handling
71-
# of dns node addresses
72-
self.connect_nodes(8, 9)
73-
self.connect_nodes(9, 8)
74-
7558
self.sync_all()
7659

7760
zero_peers = self.nodes[0].getpeerinfo()
@@ -85,31 +68,29 @@ def run_test(self):
8568
eight_peers = self.nodes[8].getpeerinfo()
8669
nine_peers = self.nodes[9].getpeerinfo()
8770

88-
for tank in self.warnet.tanks:
89-
self.log.info(
90-
f"Tank {tank.index}: {tank.warnet.tanks[tank.index].get_dns_addr()} pod:"
91-
f" {tank.warnet.tanks[tank.index].get_ip_addr()}"
92-
)
71+
for node in self.nodes:
72+
self.log.info(f"Node {node.index}: tank={node.tank} ip={node.rpchost}")
9373

94-
self.assert_connection(zero_peers, 2, ConnectionType.DNS)
95-
self.assert_connection(one_peers, 2, ConnectionType.DNS)
96-
self.assert_connection(one_peers, 3, ConnectionType.DNS)
74+
self.assert_connection(zero_peers, 2, ConnectionType.IP)
75+
self.assert_connection(one_peers, 2, ConnectionType.IP)
76+
self.assert_connection(one_peers, 3, ConnectionType.IP)
9777
self.assert_connection(two_peers, 0, ConnectionType.IP)
9878
self.assert_connection(two_peers, 1, ConnectionType.IP)
99-
self.assert_connection(two_peers, 3, ConnectionType.DNS)
100-
self.assert_connection(two_peers, 4, ConnectionType.DNS)
79+
self.assert_connection(two_peers, 3, ConnectionType.IP)
80+
self.assert_connection(two_peers, 4, ConnectionType.IP)
10181
self.assert_connection(three_peers, 1, ConnectionType.IP)
10282
self.assert_connection(three_peers, 2, ConnectionType.IP)
103-
self.assert_connection(three_peers, 5, ConnectionType.DNS)
83+
self.assert_connection(three_peers, 5, ConnectionType.IP)
10484
self.assert_connection(four_peers, 2, ConnectionType.IP)
10585
self.assert_connection(four_peers, 5, ConnectionType.IP)
10686
self.assert_connection(five_peers, 3, ConnectionType.IP)
107-
self.assert_connection(five_peers, 4, ConnectionType.DNS)
108-
self.assert_connection(five_peers, 6, ConnectionType.DNS)
87+
self.assert_connection(five_peers, 4, ConnectionType.IP)
88+
self.assert_connection(five_peers, 6, ConnectionType.IP)
10989
self.assert_connection(six_peers, 5, ConnectionType.IP)
110-
self.assert_connection(six_peers, 7, ConnectionType.DNS)
90+
self.assert_connection(six_peers, 7, ConnectionType.IP)
11191
self.assert_connection(seven_peers, 6, ConnectionType.IP)
11292
# Check the pre-connected nodes
93+
# The only connection made by DNS name would be from the initial graph edges
11394
self.assert_connection(eight_peers, 9, ConnectionType.DNS)
11495
self.assert_connection(nine_peers, 8, ConnectionType.IP)
11596

@@ -121,14 +102,15 @@ def run_test(self):
121102
def assert_connection(self, connector, connectee_index, connection_type: ConnectionType):
122103
if connection_type == ConnectionType.DNS:
123104
assert any(
124-
d.get("addr") == self.warnet.tanks[connectee_index].get_dns_addr()
105+
# ignore the ...-service suffix
106+
self.nodes[connectee_index].tank in d.get("addr")
125107
for d in connector
126-
), f"Could not find {self.options.network_name}-tank-00000{connectee_index}-service"
108+
), f"Could not find conectee hostname"
127109
elif connection_type == ConnectionType.IP:
128110
assert any(
129-
d.get("addr").split(":")[0] == self.warnet.tanks[connectee_index].get_ip_addr()
111+
d.get("addr").split(":")[0] == self.nodes[connectee_index].rpchost
130112
for d in connector
131-
), f"Could not find Tank {connectee_index}'s ip addr"
113+
), f"Could not find connectee ip addr"
132114
else:
133115
raise ValueError("ConnectionType must be of type DNS or IP")
134116

0 commit comments

Comments
 (0)