import os

import infra.basetest


class TestSELinuxInfra(infra.basetest.BRTest):
    config = infra.basetest.BASIC_TOOLCHAIN_CONFIG +\
             """
             BR2_PACKAGE_REFPOLICY=y
             BR2_PACKAGE_PYTHON3=y
             BR2_PACKAGE_SETOOLS=y
             BR2_TARGET_ROOTFS_CPIO=y
             """

    def base_test_run(self):
        cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio")
        self.emulator.boot(arch="armv5", kernel="builtin",
                           options=["-initrd", cpio_file])
        self.emulator.login()

class TestSELinuxExtraModules(TestSELinuxInfra):
    config = TestSELinuxInfra.config + \
             """
             BR2_REFPOLICY_EXTRA_MODULES="ntp tor"
             """

    def test_run(self):
        TestSELinuxInfra.base_test_run(self)

        out, ret = self.emulator.run("seinfo -t ntpd_t", 15)
        self.assertEqual(ret, 0)
        self.assertEqual(out[2].strip(), "ntpd_t")

        out, ret = self.emulator.run("seinfo -t tor_t", 15)
        self.assertEqual(ret, 0)
        self.assertEqual(out[2].strip(), "tor_t")

class TestSELinuxExtraModulesDirs(TestSELinuxInfra):
    config = TestSELinuxInfra.config + \
             """
             BR2_REFPOLICY_EXTRA_MODULES_DIRS="{}"
             """.format(infra.filepath("tests/core/test_selinux/extra_modules"))

    def test_run(self):
        TestSELinuxInfra.base_test_run(self)

        out, ret = self.emulator.run("seinfo -t buildroot_test_t", 15)
        self.assertEqual(ret, 0)
        self.assertEqual(out[2].strip(), "buildroot_test_t")

class TestSELinuxCustomGit(TestSELinuxInfra):
    config = TestSELinuxInfra.config + \
             """
             BR2_PACKAGE_REFPOLICY_CUSTOM_GIT=y
             BR2_PACKAGE_REFPOLICY_CUSTOM_REPO_URL="https://github.com/SELinuxProject/refpolicy.git"
             BR2_PACKAGE_REFPOLICY_CUSTOM_REPO_VERSION="RELEASE_2_20200818"
             """

    def test_run(self):
        pass

class TestSELinuxPackage(TestSELinuxInfra):
    br2_external = [infra.filepath("tests/core/test_selinux/br2_external")]
    config = TestSELinuxInfra.config + \
             """
             BR2_PACKAGE_SELINUX_TEST=y
             """

    def test_run(self):
        TestSELinuxInfra.base_test_run(self)

        out, ret = self.emulator.run("seinfo -t ntpd_t", 15)
        self.assertEqual(ret, 0)
        self.assertEqual(out[2].strip(), "ntpd_t")

        out, ret = self.emulator.run("seinfo -t tor_t", 15)
        self.assertEqual(ret, 0)
        self.assertEqual(out[2].strip(), "tor_t")

        out, ret = self.emulator.run("seinfo -t buildroot_test_t", 15)
        self.assertEqual(ret, 0)
        self.assertEqual(out[2].strip(), "buildroot_test_t")
