From 18f2e9bcfaa81223b47f9ec6a65998219902eaba Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 20 May 2026 23:40:51 +0900 Subject: [PATCH 1/2] test-network: try to stop test-modem-manager-mock.service only when necessary Otherwise, all test cases that does not create/start the service emits the following error: ``` Failed to stop test-modem-manager-mock.service: Unit test-modem-manager-mock.service not loaded. ``` Moreover, without this change, extra 'systemctl daemon-reload' is triggered after all test cases. That's super heavy, especially when the test is running on sanitizers. Follow-up for abe3d570f8006fca5138b2d5cfb4e8b530be02e5. --- test/test-network/systemd-networkd-tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 9a8b38a88f..877075ec5c 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -1210,7 +1210,6 @@ def tear_down_common(): stop_dnsmasq() stop_isc_dhcpd() stop_radvd() - stop_modem_manager_mock() # 2. remove modules call_quiet('rmmod netdevsim') @@ -10884,6 +10883,7 @@ class NetworkdWWANTests(unittest.TestCase, Utilities): setup_common() def tearDown(self): + stop_modem_manager_mock() tear_down_common() def test_wwan_ipv4v6_static(self): From 0080566c922b27a028001268f8c71f37e2e73b74 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 21 May 2026 00:28:38 +0900 Subject: [PATCH 2/2] test-network: add test cases for 'networkctl dhcp-lease' command Addresses the request: https://github.com/systemd/systemd/pull/42137#pullrequestreview-4305664376 --- test/test-network/systemd-networkd-tests.py | 61 +++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 877075ec5c..8609a63916 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -1174,6 +1174,10 @@ def networkctl_reload(): networkctl('reload') +def networkctl_dhcp_lease(*args): + return networkctl('dhcp-lease', *args) + + def resolvectl(*args): return check_output(*(resolvectl_cmd + list(args)), env=env) @@ -8768,6 +8772,43 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.assertIn('client provides name: test-hostname', output) self.assertIn('26:mtu', output) + print('### networkctl dhcp-lease') + output = networkctl_dhcp_lease('veth99') + print(output) + # header + self.assertIn('Hardware Type: ETHER', output) + self.assertIn('Hardware Address: 12:34:56:78:9a:bc', output) + self.assertIn(f'Client Address: {address1}', output) + self.assertIn('Server Address: 192.168.5.1', output) + # options + self.assertRegex(output, r'1 subnet mask *255\.255\.255\.0') + self.assertRegex(output, r'3 router *192\.168\.5\.1') + self.assertRegex(output, r'6 domain name server *192\.168\.5\.6\n *192\.168\.5\.7') + self.assertRegex(output, r'26 MTU size *1492') + self.assertRegex(output, r'28 broadcast address *192\.168\.5\.255') + self.assertRegex(output, r'51 lease time *2min') + self.assertRegex(output, r'53 message type *5') + self.assertRegex(output, r'54 server identifier *192\.168\.5\.1') + self.assertRegex(output, r'119 domain search *example\.com') + self.assertRegex(output, r'120 SIP server *192\.168\.5\.21\n *192\.168\.5\.22') + # extra arguments + output = networkctl_dhcp_lease('veth99', '1') + print(output) + self.assertRegex(output, r'1 subnet mask *255\.255\.255\.0') + output = networkctl_dhcp_lease('veth99', '1:auto') + print(output) + self.assertRegex(output, r'1 subnet mask *255\.255\.255\.0') + output = networkctl_dhcp_lease('veth99', '1:hex') + print(output) + self.assertRegex(output, 'CODE *NAME *DATA') + self.assertRegex(output, r'1 subnet mask *ff:ff:ff:00') + output = networkctl_dhcp_lease('veth99', '1:hex', '--no-legend') + print(output) + self.assertNotIn('CODE', output) + self.assertNotIn('NAME', output) + self.assertNotIn('DATA', output) + self.assertRegex(output, r'1 subnet mask *ff:ff:ff:00') + # change address range, DNS servers, and Domains stop_dnsmasq() start_dnsmasq( @@ -8877,6 +8918,26 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.assertIn('client provides name: test-hostname', output) self.assertIn('26:mtu', output) + print('### networkctl dhcp-lease') + output = networkctl_dhcp_lease('veth99') + print(output) + # header + self.assertIn('Hardware Type: ETHER', output) + self.assertIn('Hardware Address: 12:34:56:78:9a:bc', output) + self.assertIn(f'Client Address: {address2}', output) + self.assertIn('Server Address: 192.168.5.1', output) + # options + self.assertRegex(output, r'1 subnet mask *255\.255\.255\.0') + self.assertRegex(output, r'3 router *192\.168\.5\.1') + self.assertRegex(output, r'6 domain name server *192\.168\.5\.1\n *192\.168\.5\.7\n *192\.168\.5\.8') + self.assertRegex(output, r'26 MTU size *1492') + self.assertRegex(output, r'28 broadcast address *192\.168\.5\.255') + self.assertRegex(output, r'51 lease time *2min') + self.assertRegex(output, r'53 message type *5') + self.assertRegex(output, r'54 server identifier *192\.168\.5\.1') + self.assertRegex(output, r'119 domain search *foo\.example\.com') + self.assertRegex(output, r'120 SIP server *192\.168\.5\.23\n *192\.168\.5\.24') + self.check_netlabel('veth99', r'192\.168\.5\.0/24') self.check_nftset('addr4', r'192\.168\.5\.1')