mirror of
https://github.com/systemd/systemd.git
synced 2025-02-25 21:57:32 +03:00
test: check resolved generated resolv.conf in networkd-test (#3628)
* test: check resolved generated resolv.conf in networkd-test Directly verify the contents of /run/systemd/resolve/resolv.conf instead of /etc/resolv.conf. The latter might be a plain file or a symlink to something else (like Debian's resolvconf output), and in these cases we cannot make strong assumptions about the contents. Drop the "/etc/resolv.conf is a symlink" conditions and the "resolv.conf can have at most three nameservers" alternatives, as we know that resolved always adds all nameservers. Explicitly start resolved at the start of a test to ensure that it is running. * test: get along with existing system search domains in resolv.conf The previous change has uncovered a bug in the tests: Existing search domains can exist in resolv.conf which test_search_domains{,_too_long} didn't take into account. As existing domains take some of the "max 6 domains" and "max 255 chars" limit, don't expect that the last items from our test data actually appears in the output, just the first few.
This commit is contained in:
parent
2e0d8df13b
commit
30b42a9a36
@ -42,6 +42,8 @@ networkd_active = subprocess.call(['systemctl', 'is-active', '--quiet',
|
||||
'systemd-networkd']) == 0
|
||||
have_dnsmasq = shutil.which('dnsmasq')
|
||||
|
||||
RESOLV_CONF = '/run/systemd/resolve/resolv.conf'
|
||||
|
||||
|
||||
@unittest.skipIf(networkd_active,
|
||||
'networkd is already active')
|
||||
@ -104,6 +106,7 @@ class ClientTestBase:
|
||||
|
||||
def do_test(self, coldplug=True, ipv6=False, extra_opts='',
|
||||
online_timeout=10, dhcp_mode='yes'):
|
||||
subprocess.check_call(['systemctl', 'start', 'systemd-resolved'])
|
||||
with open(self.config, 'w') as f:
|
||||
f.write('''[Match]
|
||||
Name=%s
|
||||
@ -179,20 +182,14 @@ DHCP=%s
|
||||
self.print_server_log()
|
||||
raise
|
||||
|
||||
# verify resolv.conf if it gets dynamically managed
|
||||
if os.path.islink('/etc/resolv.conf'):
|
||||
for timeout in range(50):
|
||||
with open('/etc/resolv.conf') as f:
|
||||
contents = f.read()
|
||||
if 'nameserver 192.168.5.1\n' in contents:
|
||||
break
|
||||
# resolv.conf can have at most three nameservers; if we already
|
||||
# have three different ones, that's also okay
|
||||
if contents.count('nameserver ') >= 3:
|
||||
break
|
||||
time.sleep(0.1)
|
||||
else:
|
||||
self.fail('nameserver 192.168.5.1 not found in /etc/resolv.conf')
|
||||
for timeout in range(50):
|
||||
with open(RESOLV_CONF) as f:
|
||||
contents = f.read()
|
||||
if 'nameserver 192.168.5.1\n' in contents:
|
||||
break
|
||||
time.sleep(0.1)
|
||||
else:
|
||||
self.fail('nameserver 192.168.5.1 not found in ' + RESOLV_CONF)
|
||||
|
||||
if not coldplug:
|
||||
# check post-down.d hook
|
||||
@ -246,17 +243,12 @@ Domains= ~company''')
|
||||
self.do_test(coldplug=True, ipv6=False,
|
||||
extra_opts='IPv6AcceptRouterAdvertisements=False')
|
||||
|
||||
if os.path.islink('/etc/resolv.conf'):
|
||||
with open('/etc/resolv.conf') as f:
|
||||
contents = f.read()
|
||||
|
||||
with open(RESOLV_CONF) as f:
|
||||
contents = f.read()
|
||||
# ~company is not a search domain, only a routing domain
|
||||
self.assertNotRegex(contents, 'search.*company')
|
||||
|
||||
# our global server should appear, unless we already have three
|
||||
# (different) servers
|
||||
if contents.count('nameserver ') < 3:
|
||||
self.assertIn('nameserver 192.168.5.1\n', contents)
|
||||
# our global server should appear
|
||||
self.assertIn('nameserver 192.168.5.1\n', contents)
|
||||
|
||||
|
||||
@unittest.skipUnless(have_dnsmasq, 'dnsmasq not installed')
|
||||
@ -423,16 +415,15 @@ Domains= one two three four five six seven eight nine ten''')
|
||||
|
||||
subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
|
||||
|
||||
if os.path.islink('/etc/resolv.conf'):
|
||||
for timeout in range(50):
|
||||
with open('/etc/resolv.conf') as f:
|
||||
contents = f.read()
|
||||
if 'search one\n' in contents:
|
||||
break
|
||||
time.sleep(0.1)
|
||||
self.assertIn('search one two three four five six\n'
|
||||
'# Too many search domains configured, remaining ones ignored.\n',
|
||||
contents)
|
||||
for timeout in range(50):
|
||||
with open(RESOLV_CONF) as f:
|
||||
contents = f.read()
|
||||
if ' one' in contents:
|
||||
break
|
||||
time.sleep(0.1)
|
||||
self.assertRegex(contents, 'search .*one two three four')
|
||||
self.assertNotIn('seven\n', contents)
|
||||
self.assertIn('# Too many search domains configured, remaining ones ignored.\n', contents)
|
||||
|
||||
def test_search_domains_too_long(self):
|
||||
|
||||
@ -461,16 +452,14 @@ Domains=''')
|
||||
|
||||
subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
|
||||
|
||||
if os.path.islink('/etc/resolv.conf'):
|
||||
for timeout in range(50):
|
||||
with open('/etc/resolv.conf') as f:
|
||||
contents = f.read()
|
||||
if 'search one\n' in contents:
|
||||
break
|
||||
time.sleep(0.1)
|
||||
self.assertIn('search %(p)s0 %(p)s1 %(p)s2 %(p)s3\n'
|
||||
'# Total length of all search domains is too long, remaining ones ignored.' % {'p': name_prefix},
|
||||
contents)
|
||||
for timeout in range(50):
|
||||
with open(RESOLV_CONF) as f:
|
||||
contents = f.read()
|
||||
if ' one' in contents:
|
||||
break
|
||||
time.sleep(0.1)
|
||||
self.assertRegex(contents, 'search .*%(p)s0 %(p)s1 %(p)s2' % {'p': name_prefix})
|
||||
self.assertIn('# Total length of all search domains is too long, remaining ones ignored.', contents)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
Loading…
x
Reference in New Issue
Block a user