import os
import infra

BASIC_CONFIG = \
    """
    BR2_TARGET_ROOTFS_CPIO=y
    # BR2_TARGET_ROOTFS_TAR is not set
    """


def has_broken_links(path):
    for root, dirs, files in os.walk(path):
        for f in files:
            fpath = os.path.join(root, f)
            if not os.path.exists(fpath):
                return True
    return False


class TestExternalToolchain(infra.basetest.BRTest):
    def common_check(self):
        # Check for broken symlinks
        for d in ["lib", "usr/lib"]:
            path = os.path.join(self.builddir, "staging", d)
            self.assertFalse(has_broken_links(path))
            path = os.path.join(self.builddir, "target", d)
            self.assertFalse(has_broken_links(path))

        with open(os.path.join(self.builddir, ".config"), 'r') as configf:
            configlines = [l.strip() for l in configf.readlines()]

        if "BR2_BINFMT_ELF=y" in configlines:
            interp = infra.get_elf_prog_interpreter(self.builddir,
                                                    self.toolchain_prefix,
                                                    "bin/busybox")
            interp_path = os.path.join(self.builddir, "target", interp[1:])
            self.assertTrue(os.path.exists(interp_path))


class TestExternalToolchainSourceryArmv4(TestExternalToolchain):
    config = BASIC_CONFIG + \
        """
        BR2_arm=y
        BR2_arm920t=y
        BR2_TOOLCHAIN_EXTERNAL=y
        BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y
        """
    toolchain_prefix = "arm-none-linux-gnueabi"

    def test_run(self):
        TestExternalToolchain.common_check(self)

        # Check the architecture variant
        arch = infra.get_file_arch(self.builddir,
                                   self.toolchain_prefix,
                                   "lib/libc.so.6")
        self.assertEqual(arch, "v4T")

        # Check the sysroot symlink
        symlink = os.path.join(self.builddir, "staging", "armv4t")
        self.assertTrue(os.path.exists(symlink))
        self.assertEqual(os.readlink(symlink), "./")

        # Boot the system
        img = os.path.join(self.builddir, "images", "rootfs.cpio")
        self.emulator.boot(arch="armv5",
                           kernel="builtin",
                           options=["-initrd", img])
        self.emulator.login()


class TestExternalToolchainSourceryArmv5(TestExternalToolchain):
    config = BASIC_CONFIG + \
        """
        BR2_arm=y
        BR2_TOOLCHAIN_EXTERNAL=y
        BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y
        """
    toolchain_prefix = "arm-none-linux-gnueabi"

    def test_run(self):
        TestExternalToolchain.common_check(self)

        # Check the architecture variant
        arch = infra.get_file_arch(self.builddir,
                                   self.toolchain_prefix,
                                   "lib/libc.so.6")
        self.assertEqual(arch, "v5TE")

        # Boot the system
        img = os.path.join(self.builddir, "images", "rootfs.cpio")
        self.emulator.boot(arch="armv5",
                           kernel="builtin",
                           options=["-initrd", img])
        self.emulator.login()


class TestExternalToolchainSourceryArmv7(TestExternalToolchain):
    config = BASIC_CONFIG + \
        """
        BR2_arm=y
        BR2_cortex_a8=y
        BR2_ARM_EABI=y
        BR2_ARM_INSTRUCTIONS_THUMB2=y
        BR2_TOOLCHAIN_EXTERNAL=y
        BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y
        """
    toolchain_prefix = "arm-none-linux-gnueabi"

    def test_run(self):
        TestExternalToolchain.common_check(self)

        # Check the architecture variant
        arch = infra.get_file_arch(self.builddir,
                                   self.toolchain_prefix,
                                   "lib/libc.so.6")
        self.assertEqual(arch, "v7")
        isa = infra.get_elf_arch_tag(self.builddir,
                                     self.toolchain_prefix,
                                     "lib/libc.so.6",
                                     "Tag_THUMB_ISA_use")
        self.assertEqual(isa, "Thumb-2")

        # Check we have the sysroot symlink
        symlink = os.path.join(self.builddir, "staging", "thumb2")
        self.assertTrue(os.path.exists(symlink))
        self.assertEqual(os.readlink(symlink), "./")

        # Boot the system
        img = os.path.join(self.builddir, "images", "rootfs.cpio")
        self.emulator.boot(arch="armv7",
                           kernel="builtin",
                           options=["-initrd", img])
        self.emulator.login()


class TestExternalToolchainLinaroArm(TestExternalToolchain):
    config = BASIC_CONFIG + \
        """
        BR2_arm=y
        BR2_cortex_a8=y
        BR2_TOOLCHAIN_EXTERNAL=y
        BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM=y
        """
    toolchain_prefix = "arm-linux-gnueabihf"

    def test_run(self):
        TestExternalToolchain.common_check(self)

        # Check the architecture variant
        arch = infra.get_file_arch(self.builddir,
                                   self.toolchain_prefix,
                                   "lib/libc.so.6")
        self.assertEqual(arch, "v7")
        isa = infra.get_elf_arch_tag(self.builddir,
                                     self.toolchain_prefix,
                                     "lib/libc.so.6",
                                     "Tag_THUMB_ISA_use")
        self.assertEqual(isa, "Thumb-2")

        # Boot the system
        img = os.path.join(self.builddir, "images", "rootfs.cpio")
        self.emulator.boot(arch="armv7",
                           kernel="builtin",
                           options=["-initrd", img])
        self.emulator.login()


class TestExternalToolchainBuildrootMusl(TestExternalToolchain):
    config = BASIC_CONFIG + \
        """
        BR2_arm=y
        BR2_cortex_a9=y
        BR2_ARM_ENABLE_VFP=y
        BR2_TOOLCHAIN_EXTERNAL=y
        BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
        BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
        BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2017.05-1078-g95b1dae.tar.bz2"
        BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
        BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_12=y
        BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
        BR2_TOOLCHAIN_EXTERNAL_CXX=y
        """
    toolchain_prefix = "arm-linux"

    def test_run(self):
        TestExternalToolchain.common_check(self)
        img = os.path.join(self.builddir, "images", "rootfs.cpio")
        self.emulator.boot(arch="armv7",
                           kernel="builtin",
                           options=["-initrd", img])
        self.emulator.login()


class TestExternalToolchainCtngMusl(TestExternalToolchain):
    config = BASIC_CONFIG + \
        """
        BR2_arm=y
        BR2_cortex_a9=y
        BR2_ARM_ENABLE_VFP=y
        BR2_TOOLCHAIN_EXTERNAL=y
        BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
        BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
        BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/arm-ctng-linux-musleabihf.tar.xz"
        BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="arm-ctng-linux-musleabihf"
        BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
        BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_10=y
        BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
        BR2_TOOLCHAIN_EXTERNAL_CXX=y
        """
    toolchain_prefix = "arm-ctng-linux-musleabihf"

    def test_run(self):
        TestExternalToolchain.common_check(self)
        img = os.path.join(self.builddir, "images", "rootfs.cpio")
        self.emulator.boot(arch="armv7",
                           kernel="builtin",
                           options=["-initrd", img])
        self.emulator.login()


class TestExternalToolchainBuildrootuClibc(TestExternalToolchain):
    config = BASIC_CONFIG + \
        """
        BR2_arm=y
        BR2_TOOLCHAIN_EXTERNAL=y
        BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
        BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
        BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-full-2017.05-1078-g95b1dae.tar.bz2"
        BR2_TOOLCHAIN_EXTERNAL_GCC_4_9=y
        BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_10=y
        BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
        # BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
        BR2_TOOLCHAIN_EXTERNAL_CXX=y
        """
    toolchain_prefix = "arm-linux"

    def test_run(self):
        TestExternalToolchain.common_check(self)
        img = os.path.join(self.builddir, "images", "rootfs.cpio")
        self.emulator.boot(arch="armv7",
                           kernel="builtin",
                           options=["-initrd", img])
        self.emulator.login()


class TestExternalToolchainCCache(TestExternalToolchainBuildrootuClibc):
    extraconfig = \
        """
        BR2_CCACHE=y
        BR2_CCACHE_DIR="{builddir}/ccache-dir"
        """

    def __init__(self, names):
        super(TestExternalToolchainBuildrootuClibc, self).__init__(names)
        self.config += self.extraconfig.format(builddir=self.builddir)
