kumquat-buildroot/support/testing/tests/init/test_systemd.py

409 lines
13 KiB
Python
Raw Normal View History

import infra.basetest
import re
from tests.init.base import InitSystemBase as InitSystemBase
# In the following tests, the read-only cases use the default settings,
# which historically used both a factory to populate a tmpfs on /var,
# and pre-populated /var at buildtime. Since these are the default
# settings, and they proved to generate a system that ultimately boots,
# we still want to keep testing that. See later, below, for the
# specialised test cases.
class InitSystemSystemdBase(InitSystemBase):
config = \
"""
BR2_arm=y
support/testing: fix systemd test by using a more recent gcc As reported on the mailing list [0], there is a build issue with systemd 245 when using gcc < 5.0, due to the following build issue: ../src/shared/gpt.c:7:9: error: initializer element is not constant { GPT_ROOT_X86, "root-x86" }, The pre-built external toolchain we have for armv5 (the default with just BR2_arm=y) is a very old toolchain from CodeSourcery, which has a gcc 4.8; we have no other pre-built toolchains for armv5, except by using a custom one, like those from the Bootlin toolchain builder. But using a custom toolchain is not nice, as we want our runtime test to test nominal configurations. So, switch the systemd tests to use a Cortex-A9, so that we can use the ARM 2019.12 toolchain, and with VFP, so that it can boot in the qemu vexpress machine we use for the test-cases. Fixes: https://gitlab.com/buildroot.org/buildroot/-/jobs/498144403 https://gitlab.com/buildroot.org/buildroot/-/jobs/498144405 https://gitlab.com/buildroot.org/buildroot/-/jobs/498144406 https://gitlab.com/buildroot.org/buildroot/-/jobs/498144408 https://gitlab.com/buildroot.org/buildroot/-/jobs/498144410 https://gitlab.com/buildroot.org/buildroot/-/jobs/498144412 [0] http://lists.busybox.net/pipermail/buildroot/2020-April/278931.html Signed-off-by: Romain Naour <romain.naour@gmail.com> [yann.morin.1998@free.fr: - just use cortex-a9_VFP, instead of using a bootlin toolchain - adapt the commit log accordingly ] Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2020-04-05 00:08:41 +02:00
BR2_cortex_a9=y
BR2_ARM_ENABLE_VFP=y
BR2_TOOLCHAIN_EXTERNAL=y
support/run-test: add test for systemd using dbus-broker Add four new tests for systemd (rw and ro in each case): - use dbus-broker instead of the original dbus - use the original dbus, with dbus-broker installed The first two extend the existing IfUpDown test cases by just enabling dbus-broker; the second ones extend this further, by explicitly enabling the original dbus. For one of the tests, we overload the test_run() function to test that the dbus-broker daemon is indeed running as root. We need not replicate that check in the other dbus-broker-only test, and it does not make sense to test that in tests that have the original dbus enabled. Presence of the original dbus and dbus-broker on the same system is valid: the original dbus is used as the default system bus daemon. We do not test switching between the two at runtime, though as this is really too corner-case specific. We just test to ensure the original dbus system bus daemon is not impacted by the presence of dbus-broker. Note: the 'full' test-case enables all systemd options, and some of them do pull the original dbus package, so we can't use that to test the integration of dbus-broker; instead, we extend the ifupdown case, which does not enable the original dbus. The default external toolchain for cortex-A9 is the old ARM toolchain which has kernel headers 4.10 Since dbus-broker needs toolchain headers >= 4.17, it can't be selected with this toolchain. Switch the systemd tests to the Bootlin toolchains instead. We switch all of them to make things easier. Note that we will need to take care in the future that the headers version used in the bootlin toolchain doesn't get bigger than the kernel that is used. The kernel is currently 5.10, the headers in the bleeding edge bootlin toolchain are 5.4. Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Norbert Lange <nolange79@gmail.com> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2022-01-09 23:16:50 +01:00
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN=y
BR2_INIT_SYSTEMD=y
BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
# BR2_TARGET_ROOTFS_TAR is not set
BR2_PER_PACKAGE_DIRECTORIES=y
"""
def check_systemd(self, fs):
if "BR2_LINUX_KERNEL=y" in self.config:
self.start_emulator(fs, "zImage", "vexpress-v2p-ca9")
else:
self.start_emulator(fs)
self.check_init("/lib/systemd/systemd")
# Test all units are OK
output, _ = self.emulator.run("systemctl --no-pager --failed --no-legend")
self.assertEqual(len(output), 0)
# Test we can reach the DBus daemon
self.assertRunOk("busctl --no-pager")
# Test we can read at least one line from the journal
output, _ = self.emulator.run("journalctl --no-pager --lines 1 --quiet")
self.assertEqual(len(output), 1)
# Check the network is up
self.check_network("eth0")
class TestInitSystemSystemdRoNetworkd(InitSystemSystemdBase):
config = InitSystemSystemdBase.config + \
"""
BR2_SYSTEM_DHCP="eth0"
# BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is not set
BR2_TARGET_ROOTFS_SQUASHFS=y
"""
def test_run(self):
self.check_systemd("squashfs")
class TestInitSystemSystemdRwNetworkd(InitSystemSystemdBase):
config = InitSystemSystemdBase.config + \
"""
BR2_SYSTEM_DHCP="eth0"
BR2_TARGET_ROOTFS_EXT2=y
"""
def test_run(self):
self.check_systemd("ext2")
class TestInitSystemSystemdRoIfupdown(InitSystemSystemdBase):
config = InitSystemSystemdBase.config + \
"""
BR2_SYSTEM_DHCP="eth0"
# BR2_PACKAGE_SYSTEMD_NETWORKD is not set
# BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is not set
BR2_TARGET_ROOTFS_SQUASHFS=y
"""
def test_run(self):
self.check_systemd("squashfs")
support/run-test: add test for systemd using dbus-broker Add four new tests for systemd (rw and ro in each case): - use dbus-broker instead of the original dbus - use the original dbus, with dbus-broker installed The first two extend the existing IfUpDown test cases by just enabling dbus-broker; the second ones extend this further, by explicitly enabling the original dbus. For one of the tests, we overload the test_run() function to test that the dbus-broker daemon is indeed running as root. We need not replicate that check in the other dbus-broker-only test, and it does not make sense to test that in tests that have the original dbus enabled. Presence of the original dbus and dbus-broker on the same system is valid: the original dbus is used as the default system bus daemon. We do not test switching between the two at runtime, though as this is really too corner-case specific. We just test to ensure the original dbus system bus daemon is not impacted by the presence of dbus-broker. Note: the 'full' test-case enables all systemd options, and some of them do pull the original dbus package, so we can't use that to test the integration of dbus-broker; instead, we extend the ifupdown case, which does not enable the original dbus. The default external toolchain for cortex-A9 is the old ARM toolchain which has kernel headers 4.10 Since dbus-broker needs toolchain headers >= 4.17, it can't be selected with this toolchain. Switch the systemd tests to the Bootlin toolchains instead. We switch all of them to make things easier. Note that we will need to take care in the future that the headers version used in the bootlin toolchain doesn't get bigger than the kernel that is used. The kernel is currently 5.10, the headers in the bleeding edge bootlin toolchain are 5.4. Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Norbert Lange <nolange79@gmail.com> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2022-01-09 23:16:50 +01:00
class TestInitSystemSystemdRoIfupdownDbusbroker(TestInitSystemSystemdRoIfupdown):
config = TestInitSystemSystemdRoIfupdown.config + \
"""
BR2_PACKAGE_DBUS_BROKER=y
"""
def test_run(self):
# Parent class' test_run() method does exactly that, no more:
self.check_systemd("squashfs")
# Check that the dbus-broker daemon is running as non-root
cmd = "find /proc/$(pidof dbus-broker) -maxdepth 1 -name exe -user dbus"
out, _ = self.emulator.run(cmd)
self.assertEqual(len(out), 1)
class TestInitSystemSystemdRoIfupdownDbusbrokerDbus(TestInitSystemSystemdRoIfupdownDbusbroker):
config = TestInitSystemSystemdRoIfupdownDbusbroker.config + \
"""
BR2_PACKAGE_DBUS=y
"""
class TestInitSystemSystemdRwIfupdown(InitSystemSystemdBase):
config = InitSystemSystemdBase.config + \
"""
BR2_SYSTEM_DHCP="eth0"
# BR2_PACKAGE_SYSTEMD_NETWORKD is not set
BR2_TARGET_ROOTFS_EXT2=y
"""
def test_run(self):
self.check_systemd("ext2")
support/run-test: add test for systemd using dbus-broker Add four new tests for systemd (rw and ro in each case): - use dbus-broker instead of the original dbus - use the original dbus, with dbus-broker installed The first two extend the existing IfUpDown test cases by just enabling dbus-broker; the second ones extend this further, by explicitly enabling the original dbus. For one of the tests, we overload the test_run() function to test that the dbus-broker daemon is indeed running as root. We need not replicate that check in the other dbus-broker-only test, and it does not make sense to test that in tests that have the original dbus enabled. Presence of the original dbus and dbus-broker on the same system is valid: the original dbus is used as the default system bus daemon. We do not test switching between the two at runtime, though as this is really too corner-case specific. We just test to ensure the original dbus system bus daemon is not impacted by the presence of dbus-broker. Note: the 'full' test-case enables all systemd options, and some of them do pull the original dbus package, so we can't use that to test the integration of dbus-broker; instead, we extend the ifupdown case, which does not enable the original dbus. The default external toolchain for cortex-A9 is the old ARM toolchain which has kernel headers 4.10 Since dbus-broker needs toolchain headers >= 4.17, it can't be selected with this toolchain. Switch the systemd tests to the Bootlin toolchains instead. We switch all of them to make things easier. Note that we will need to take care in the future that the headers version used in the bootlin toolchain doesn't get bigger than the kernel that is used. The kernel is currently 5.10, the headers in the bleeding edge bootlin toolchain are 5.4. Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Norbert Lange <nolange79@gmail.com> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2022-01-09 23:16:50 +01:00
class TestInitSystemSystemdRwIfupdownDbusbroker(TestInitSystemSystemdRwIfupdown):
config = TestInitSystemSystemdRwIfupdown.config + \
"""
BR2_PACKAGE_DBUS_BROKER=y
"""
def test_run(self):
# Parent class' test_run() method does exactly that, no more:
self.check_systemd("ext2")
# Check that the dbus-broker daemon is running as non-root
cmd = "find /proc/$(pidof dbus-broker) -maxdepth 1 -name exe -user dbus"
out, _ = self.emulator.run(cmd)
self.assertEqual(len(out), 1)
class TestInitSystemSystemdRwIfupdownDbusbrokerDbus(TestInitSystemSystemdRwIfupdownDbusbroker):
config = TestInitSystemSystemdRwIfupdownDbusbroker.config + \
"""
BR2_PACKAGE_DBUS=y
"""
class TestInitSystemSystemdRoFull(InitSystemSystemdBase):
config = InitSystemSystemdBase.config + \
"""
BR2_SYSTEM_DHCP="eth0"
# BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is not set
BR2_PACKAGE_SYSTEMD_JOURNAL_REMOTE=y
BR2_PACKAGE_SYSTEMD_BACKLIGHT=y
BR2_PACKAGE_SYSTEMD_BINFMT=y
BR2_PACKAGE_SYSTEMD_COREDUMP=y
BR2_PACKAGE_SYSTEMD_FIRSTBOOT=y
BR2_PACKAGE_SYSTEMD_HIBERNATE=y
BR2_PACKAGE_SYSTEMD_IMPORTD=y
BR2_PACKAGE_SYSTEMD_LOCALED=y
BR2_PACKAGE_SYSTEMD_LOGIND=y
BR2_PACKAGE_SYSTEMD_MACHINED=y
BR2_PACKAGE_SYSTEMD_POLKIT=y
BR2_PACKAGE_SYSTEMD_QUOTACHECK=y
BR2_PACKAGE_SYSTEMD_RANDOMSEED=y
BR2_PACKAGE_SYSTEMD_RFKILL=y
BR2_PACKAGE_SYSTEMD_SMACK_SUPPORT=y
BR2_PACKAGE_SYSTEMD_SYSUSERS=y
BR2_PACKAGE_SYSTEMD_VCONSOLE=y
BR2_TARGET_ROOTFS_SQUASHFS=y
"""
def test_run(self):
self.check_systemd("squashfs")
class TestInitSystemSystemdRwFull(InitSystemSystemdBase):
config = InitSystemSystemdBase.config + \
"""
BR2_SYSTEM_DHCP="eth0"
BR2_PACKAGE_SYSTEMD_JOURNAL_REMOTE=y
BR2_PACKAGE_SYSTEMD_BACKLIGHT=y
BR2_PACKAGE_SYSTEMD_BINFMT=y
BR2_PACKAGE_SYSTEMD_COREDUMP=y
BR2_PACKAGE_SYSTEMD_FIRSTBOOT=y
BR2_PACKAGE_SYSTEMD_HIBERNATE=y
BR2_PACKAGE_SYSTEMD_IMPORTD=y
BR2_PACKAGE_SYSTEMD_LOCALED=y
BR2_PACKAGE_SYSTEMD_LOGIND=y
BR2_PACKAGE_SYSTEMD_MACHINED=y
BR2_PACKAGE_SYSTEMD_POLKIT=y
BR2_PACKAGE_SYSTEMD_QUOTACHECK=y
BR2_PACKAGE_SYSTEMD_RANDOMSEED=y
BR2_PACKAGE_SYSTEMD_RFKILL=y
BR2_PACKAGE_SYSTEMD_SMACK_SUPPORT=y
BR2_PACKAGE_SYSTEMD_SYSUSERS=y
BR2_PACKAGE_SYSTEMD_VCONSOLE=y
BR2_TARGET_ROOTFS_EXT2=y
"""
def test_run(self):
self.check_systemd("ext2")
# The following tests are all about read-only rootfs, and exercise either
# using an un-populated factory for /var, or an overlaysfs ontop of a
# pre-populated /var. They all specialise the TestInitSystemSystemdRo*
# test cases above.
# Helper class for factory-based tests
class InitSystemSystemdBaseFactory():
config = \
"""
# BR2_INIT_SYSTEMD_POPULATE_TMPFILES is not set
BR2_ROOTFS_OVERLAY="{}"
""".format(infra.filepath("tests/init/systemd-factory"))
def test_run(self):
super().test_run()
# This one must be executed on the target, to check that
# the factory feature works as expected
out, exit_code = self.emulator.run("cat /var/foo/bar")
self.assertEqual(exit_code, 0)
self.assertEqual(out[0], "foobar")
# /var/foo/bar is from the /var factory
_, exit_code = self.emulator.run("test -e /usr/share/factory/var/foo/bar")
self.assertEqual(exit_code, 0)
# We can write in /var/foo/bar
_, exit_code = self.emulator.run("echo barfoo >/var/foo/bar")
self.assertEqual(exit_code, 0)
# ... and it contains the new content
out, exit_code = self.emulator.run("cat /var/foo/bar")
self.assertEqual(exit_code, 0)
self.assertEqual(out[0], "barfoo")
# ... but the factory is umodified
out, exit_code = self.emulator.run("cat /usr/share/factory/var/foo/bar")
self.assertEqual(exit_code, 0)
self.assertEqual(out[0], "foobar")
class TestInitSystemSystemdRoNetworkdFactory(
InitSystemSystemdBaseFactory,
TestInitSystemSystemdRoNetworkd,
):
config = InitSystemSystemdBaseFactory.config + \
TestInitSystemSystemdRoNetworkd.config
class TestInitSystemSystemdRoIfupdownFactory(
InitSystemSystemdBaseFactory,
TestInitSystemSystemdRoIfupdown,
):
config = InitSystemSystemdBaseFactory.config + \
TestInitSystemSystemdRoIfupdown.config
class TestInitSystemSystemdRoIfupdownDbusbrokerFactory(
InitSystemSystemdBaseFactory,
TestInitSystemSystemdRoIfupdownDbusbroker,
):
config = InitSystemSystemdBaseFactory.config + \
TestInitSystemSystemdRoIfupdownDbusbroker.config
class TestInitSystemSystemdRoIfupdownDbusbrokerDbusFactory(
InitSystemSystemdBaseFactory,
TestInitSystemSystemdRoIfupdownDbusbrokerDbus,
):
config = InitSystemSystemdBaseFactory.config + \
TestInitSystemSystemdRoIfupdownDbusbrokerDbus.config
class TestInitSystemSystemdRoFullFactory(
InitSystemSystemdBaseFactory,
TestInitSystemSystemdRoFull,
):
config = InitSystemSystemdBaseFactory.config + \
TestInitSystemSystemdRoFull.config
# Helper class for overlayfs-based tests
class InitSystemSystemdBaseOverlayfs():
config = \
"""
# BR2_INIT_SYSTEMD_VAR_FACTORY is not set
BR2_INIT_SYSTEMD_VAR_OVERLAYFS=y
BR2_ROOTFS_OVERLAY="{}"
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="5.10.202"
BR2_LINUX_KERNEL_DEFCONFIG="vexpress"
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="{}"
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="vexpress-v2p-ca9"
""".format(infra.filepath("tests/init/systemd-factory"),
infra.filepath("conf/overlayfs-kernel-fragment.config"))
def test_run(self):
super().test_run()
# This one must be executed on the target, to check that
# the tmpfiles pre-populate works as expected
out, exit_code = self.emulator.run("cat /var/foo/bar")
self.assertEqual(exit_code, 0)
self.assertEqual(out[0], "foobar")
# /var/foo/bar is from the pre-populated /var, so it should
# not be present in the upper of the overlay
_, exit_code = self.emulator.run("test -e /run/buildroot/mounts/var/upper/foo/bar")
self.assertNotEqual(exit_code, 0)
# We can write in /var/foo/bar
_, exit_code = self.emulator.run("echo barfoo >/var/foo/bar")
self.assertEqual(exit_code, 0)
# ... and it contains the new content
out, exit_code = self.emulator.run("cat /var/foo/bar")
self.assertEqual(exit_code, 0)
self.assertEqual(out[0], "barfoo")
# ... and it to appears in the upper
_, exit_code = self.emulator.run("test -e /run/buildroot/mounts/var/upper/foo/bar")
self.assertEqual(exit_code, 0)
# ... with the new content
out, exit_code = self.emulator.run("cat /run/buildroot/mounts/var/upper/foo/bar")
self.assertEqual(exit_code, 0)
self.assertEqual(out[0], "barfoo")
# ... while the lower still has the oldcontent
out, exit_code = self.emulator.run("cat /run/buildroot/mounts/var/lower/foo/bar")
self.assertEqual(exit_code, 0)
self.assertEqual(out[0], "foobar")
class TestInitSystemSystemdRoNetworkdOverlayfs(
InitSystemSystemdBaseOverlayfs,
TestInitSystemSystemdRoNetworkd,
):
config = InitSystemSystemdBaseOverlayfs.config + \
TestInitSystemSystemdRoNetworkd.config
class TestInitSystemSystemdRoIfupdownOverlayfs(
InitSystemSystemdBaseOverlayfs,
TestInitSystemSystemdRoIfupdown,
):
config = InitSystemSystemdBaseOverlayfs.config + \
TestInitSystemSystemdRoIfupdown.config
class TestInitSystemSystemdRoIfupdownDbusbrokerOverlayfs(
InitSystemSystemdBaseOverlayfs,
TestInitSystemSystemdRoIfupdownDbusbroker,
):
config = InitSystemSystemdBaseOverlayfs.config + \
TestInitSystemSystemdRoIfupdownDbusbroker.config
class TestInitSystemSystemdRoIfupdownDbusbrokerDbusOverlayfs(
InitSystemSystemdBaseOverlayfs,
TestInitSystemSystemdRoIfupdownDbusbrokerDbus,
):
config = InitSystemSystemdBaseOverlayfs.config + \
TestInitSystemSystemdRoIfupdownDbusbrokerDbus.config
class TestInitSystemSystemdRoFullOverlayfs(
InitSystemSystemdBaseOverlayfs,
TestInitSystemSystemdRoFull,
):
config = InitSystemSystemdBaseOverlayfs.config + \
TestInitSystemSystemdRoFull.config
class InitSystemSystemdBaseOverlayfsVarBacking(InitSystemBase):
@classmethod
def gen_config(cls, overlaydir: str) -> str:
return re.sub(
r'^\s*BR2_ROOTFS_OVERLAY="(.*)"$',
'BR2_ROOTFS_OVERLAY="\\1 {}"'.format(infra.filepath(overlaydir)),
TestInitSystemSystemdRoFullOverlayfs.config,
flags=re.MULTILINE,
)
def check_var_mounted(self):
self.assertRunOk("grep '^other-var-backing-store /run/buildroot/mounts/var tmpfs' /proc/mounts")
class TestInitSystemSystemdRoFullOverlayfsVarBackingMountUnit(
TestInitSystemSystemdRoFullOverlayfs,
InitSystemSystemdBaseOverlayfsVarBacking,
):
config = InitSystemSystemdBaseOverlayfsVarBacking.gen_config(
'tests/init/systemd-overlay-mount-unit',
)
def test_run(self):
super().test_run()
self.check_var_mounted()
class TestInitSystemSystemdRoFullOverlayfsVarBackingFstab(
TestInitSystemSystemdRoFullOverlayfs,
InitSystemSystemdBaseOverlayfsVarBacking,
):
config = InitSystemSystemdBaseOverlayfsVarBacking.gen_config(
'tests/init/systemd-overlay-fstab',
)
def test_run(self):
super().test_run()
self.check_var_mounted()