import os

import infra.basetest


class TestSELinuxSystemd(infra.basetest.BRTest):
    config = \
        """
        BR2_x86_64=y
        BR2_x86_corei7=y
        BR2_TOOLCHAIN_EXTERNAL=y
        BR2_INIT_SYSTEMD=y
        BR2_LINUX_KERNEL=y
        BR2_LINUX_KERNEL_CUSTOM_VERSION=y
        BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="5.8.12"
        BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
        BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/x86_64/linux.config"
        BR2_PACKAGE_LIBSELINUX=y
        BR2_PACKAGE_REFPOLICY=y
        """

    def wait_boot(self):
        # The complete boot with systemd takes more time than what the default multipler permits
        self.emulator.timeout_multiplier *= 10
        self.emulator.login()

    def run_tests(self, fstype):
        kernel = os.path.join(self.builddir, "images", "bzImage")
        rootfs = os.path.join(self.builddir, "images", "rootfs.{}".format(fstype))

        self.emulator.boot(arch="x86_64", kernel=kernel,
                           kernel_cmdline=["root=/dev/vda", "rootfstype={}".format(fstype),
                                           "console=ttyS0", "security=selinux"],
                           options=["-cpu", "Nehalem",
                                    "-drive", "file={},if=virtio,format=raw".format(rootfs)])
        self.wait_boot()

        # Test the reported SELinux mode.
        out, ret = self.emulator.run("getenforce")
        self.assertEqual(ret, 0)
        self.assertEqual(out[0], "Permissive")

        # Check the extended arguments are correctly set.
        out, ret = self.emulator.run("ls -dZ /")
        self.assertEqual(ret, 0)
        self.assertEqual(out[0].split()[0], "system_u:object_r:root_t")

        # Check init's attributes.
        out, ret = self.emulator.run("cat /proc/1/attr/current")
        self.assertEqual(ret, 0)
        self.assertEqual(out[0], "system_u:system_r:init_t\0")

class TestSELinuxSystemdExt4(TestSELinuxSystemd):
    config = TestSELinuxSystemd.config + \
        """
        BR2_TARGET_ROOTFS_EXT2=y
        BR2_TARGET_ROOTFS_EXT2_4=y
        BR2_TARGET_ROOTFS_EXT2_SIZE="100M"
        """

    def test_run(self):
        self.run_tests("ext4")

class TestSELinuxSystemdSquashfs(TestSELinuxSystemd):
    config = TestSELinuxSystemd.config + \
        """
        BR2_TARGET_ROOTFS_SQUASHFS=y
        BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="{}"
        """.format(
            infra.filepath("tests/init/test_systemd_selinux/linux-squashfs.fragment"),
        )

    def test_run(self):
        self.run_tests("squashfs")
