Skip to content

Commit c2a5010

Browse files
committed
test: type netlib fully
1 parent 81af7d0 commit c2a5010

File tree

2 files changed

+43
-21
lines changed

2 files changed

+43
-21
lines changed

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ module = [
7070
# test/common
7171
'testlib',
7272
'packagelib',
73+
'netlib',
7374
'js_coverage',
7475
'webdriver_bidi',
7576
]

test/common/netlib.py

+42-21
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,20 @@
1717

1818
import re
1919
import subprocess
20+
import unittest
21+
from collections.abc import Sequence, Set
2022

21-
from testlib import Error, MachineCase, wait
23+
from machine import testvm
24+
from machine.machine_core.machine_virtual import VirtMachine
25+
from testlib import Browser, Error, MachineCase, wait
2226

2327

24-
class NetworkHelpers:
28+
class NetworkHelpers(unittest.TestCase):
2529
"""Mix-in class for tests that require network setup"""
30+
browser: Browser
31+
machine: testvm.Machine
2632

27-
def add_veth(self, name, dhcp_cidr=None, dhcp_range=None):
33+
def add_veth(self, name: str, dhcp_cidr: str | None = None, dhcp_range: Sequence[str] | None = None) -> None:
2834
"""Add a veth device that is manageable with NetworkManager
2935
3036
This is safe for @nondestructive tests, the interface gets cleaned up automatically.
@@ -53,7 +59,7 @@ def add_veth(self, name, dhcp_cidr=None, dhcp_range=None):
5359
self.addCleanup(self.machine.execute, f"kill {server}; rm -rf /run/dnsmasq")
5460
self.machine.execute("if firewall-cmd --state >/dev/null 2>&1; then firewall-cmd --add-service=dhcp; fi")
5561

56-
def nm_activate_eth(self, iface):
62+
def nm_activate_eth(self, iface: str) -> None:
5763
"""Create an NM connection for a given interface"""
5864

5965
m = self.machine
@@ -62,26 +68,26 @@ def nm_activate_eth(self, iface):
6268
m.execute(f"nmcli con up {iface} ifname {iface}")
6369
self.addCleanup(m.execute, f"nmcli con delete {iface}")
6470

65-
def nm_checkpoints_disable(self):
71+
def nm_checkpoints_disable(self) -> None:
6672
self.browser.eval_js("window.cockpit_tests_disable_checkpoints = true;")
6773

68-
def nm_checkpoints_enable(self, settle_time=3.0):
74+
def nm_checkpoints_enable(self, settle_time: float = 3.0) -> None:
6975
self.browser.eval_js("window.cockpit_tests_disable_checkpoints = false;")
7076
self.browser.eval_js(f"window.cockpit_tests_checkpoint_settle_time = {settle_time};")
7177

7278

7379
class NetworkCase(MachineCase, NetworkHelpers):
74-
def setUp(self):
80+
def setUp(self) -> None:
7581
super().setUp()
7682

7783
m = self.machine
7884

7985
# clean up after nondestructive tests
8086
if self.is_nondestructive():
81-
def devs():
87+
def devs() -> Set[str]:
8288
return set(self.machine.execute("ls /sys/class/net/ | grep -v bonding_masters").strip().split())
8389

84-
def cleanupDevs():
90+
def cleanupDevs() -> None:
8591
new = devs() - self.orig_devs
8692
self.machine.execute(f"for d in {' '.join(new)}; do nmcli dev del $d; done")
8793

@@ -140,8 +146,10 @@ def getit():
140146
print(f"{mac} -> {iface}")
141147
return iface
142148

143-
def add_iface(self, activate=True):
149+
def add_iface(self, activate: bool = True) -> str:
144150
m = self.machine
151+
assert isinstance(m, VirtMachine)
152+
assert self.network is not None
145153
mac = m.add_netiface(networking=self.network.interface())
146154
# Wait for the interface to show up
147155
self.get_iface(m, mac)
@@ -152,7 +160,7 @@ def add_iface(self, activate=True):
152160
self.nm_activate_eth(iface)
153161
return iface
154162

155-
def wait_for_iface(self, iface, active=True, state=None, prefix="10.111."):
163+
def wait_for_iface(self, iface: str, active: bool = True, state: str | None = None, prefix: str = "10.111.") -> None:
156164
sel = f"#networking-interfaces tr[data-interface='{iface}']"
157165

158166
if state:
@@ -170,31 +178,31 @@ def wait_for_iface(self, iface, active=True, state=None, prefix="10.111."):
170178
print(self.machine.execute(f"grep . /sys/class/net/*/address; nmcli con; nmcli dev; nmcli dev show {iface} || true"))
171179
raise e
172180

173-
def select_iface(self, iface):
181+
def select_iface(self, iface: str) -> None:
174182
b = self.browser
175183
b.click(f"#networking-interfaces tr[data-interface='{iface}'] button")
176184

177-
def iface_con_id(self, iface):
185+
def iface_con_id(self, iface: str) -> str | None:
178186
con_id = self.machine.execute(f"nmcli -m tabular -t -f GENERAL.CONNECTION device show {iface}").strip()
179187
if con_id == "" or con_id == "--":
180188
return None
181189
else:
182190
return con_id
183191

184-
def wait_for_iface_setting(self, setting_title, setting_value):
192+
def wait_for_iface_setting(self, setting_title: str, setting_value: str) -> None:
185193
b = self.browser
186194
b.wait_in_text(f"dt:contains('{setting_title}') + dd", setting_value)
187195

188-
def configure_iface_setting(self, setting_title):
196+
def configure_iface_setting(self, setting_title: str) -> None:
189197
b = self.browser
190198
b.click(f"dt:contains('{setting_title}') + dd button")
191199

192-
def ensure_nm_uses_dhclient(self):
200+
def ensure_nm_uses_dhclient(self) -> None:
193201
m = self.machine
194202
m.write("/etc/NetworkManager/conf.d/99-dhcp.conf", "[main]\ndhcp=dhclient\n")
195203
m.execute("systemctl restart NetworkManager")
196204

197-
def slow_down_dhclient(self, delay):
205+
def slow_down_dhclient(self, delay: int) -> None:
198206
self.machine.execute(f"""
199207
mkdir -p {self.vm_tmpdir}
200208
cp -a /usr/sbin/dhclient {self.vm_tmpdir}/dhclient.real
@@ -205,12 +213,25 @@ def slow_down_dhclient(self, delay):
205213
""")
206214
self.addCleanup(self.machine.execute, "umount /usr/sbin/dhclient")
207215

208-
def wait_onoff(self, sel, val):
216+
def wait_onoff(self, sel: str, *, val: bool) -> None:
209217
self.browser.wait_visible(sel + " input[type=checkbox]" + (":checked" if val else ":not(:checked)"))
210218

211-
def toggle_onoff(self, sel):
219+
def toggle_onoff(self, sel: str) -> None:
212220
self.browser.click(sel + " input[type=checkbox]")
213221

214-
def login_and_go(self, *args, **kwargs):
215-
super().login_and_go(*args, **kwargs)
222+
def login_and_go(
223+
self,
224+
path: str | None = None,
225+
*,
226+
user: str | None = None,
227+
password: str | None = None,
228+
host: str | None = None,
229+
superuser: bool = True,
230+
urlroot: str | None = None,
231+
tls: bool = False,
232+
enable_root_login: bool = False
233+
) -> None:
234+
super().login_and_go(path=path, user=user, password=password,
235+
host=host, superuser=superuser, urlroot=urlroot,
236+
tls=tls, enable_root_login=enable_root_login)
216237
self.nm_checkpoints_disable()

0 commit comments

Comments
 (0)