# SPDX-License-Identifier: MIT
import os
from oeqa.core.decorator import OETestTag
from oeqa.core.case import OEPTestResultTestCase
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars, runqemu, Command

def parse_values(content):
    for i in content:
        for v in ["PASS", "FAIL", "XPASS", "XFAIL", "UNRESOLVED", "UNSUPPORTED", "UNTESTED", "ERROR", "WARNING"]:
            if i.startswith(v + ": "):
                yield i[len(v) + 2:].strip(), v
                break

class GccSelfTestBase(OESelftestTestCase, OEPTestResultTestCase):
    def check_skip(self, suite):
        targets = get_bb_var("RUNTIMETARGET", "gcc-runtime").split()
        if suite not in targets:
            self.skipTest("Target does not use {0}".format(suite))

    def run_check(self, *suites, ssh = None):
        targets = set()
        for s in suites:
            if s in ["gcc", "g++"]:
                targets.add("check-gcc")
            else:
                targets.add("check-target-{}".format(s))

        # configure ssh target
        features = []
        features.append('MAKE_CHECK_TARGETS = "{0}"'.format(" ".join(targets)))
        if ssh is not None:
            features.append('TOOLCHAIN_TEST_TARGET = "ssh"')
            features.append('TOOLCHAIN_TEST_HOST = "{0}"'.format(ssh))
            features.append('TOOLCHAIN_TEST_HOST_USER = "root"')
            features.append('TOOLCHAIN_TEST_HOST_PORT = "22"')
        self.write_config("\n".join(features))

        recipe = "gcc-runtime"
        bitbake("{} -c check".format(recipe))

        bb_vars = get_bb_vars(["B", "TARGET_SYS"], recipe)
        builddir, target_sys = bb_vars["B"], bb_vars["TARGET_SYS"]

        for suite in suites:
            sumspath = os.path.join(builddir, "gcc", "testsuite", suite, "{0}.sum".format(suite))
            if not os.path.exists(sumspath): # check in target dirs
                sumspath = os.path.join(builddir, target_sys, suite, "testsuite", "{0}.sum".format(suite))
            if not os.path.exists(sumspath): # handle libstdc++-v3 -> libstdc++
                sumspath = os.path.join(builddir, target_sys, suite, "testsuite", "{0}.sum".format(suite.split("-")[0]))
            logpath = os.path.splitext(sumspath)[0] + ".log"

            ptestsuite = "gcc-{}".format(suite) if suite != "gcc" else suite
            ptestsuite = ptestsuite + "-user" if ssh is None else ptestsuite
            self.ptest_section(ptestsuite, logfile = logpath)
            with open(sumspath, "r") as f:
                for test, result in parse_values(f):
                    self.ptest_result(ptestsuite, test, result)

    def run_check_emulated(self, *args, **kwargs):
        # build core-image-minimal with required packages
        default_installed_packages = ["libgcc", "libstdc++", "libatomic", "libgomp"]
        features = []
        features.append('IMAGE_FEATURES += "ssh-server-openssh"')
        features.append('CORE_IMAGE_EXTRA_INSTALL += "{0}"'.format(" ".join(default_installed_packages)))
        self.write_config("\n".join(features))
        bitbake("core-image-minimal")

        # wrap the execution with a qemu instance
        with runqemu("core-image-minimal", runqemuparams = "nographic") as qemu:
            # validate that SSH is working
            status, _ = qemu.run("uname")
            self.assertEqual(status, 0)

            return self.run_check(*args, ssh=qemu.ip, **kwargs)

@OETestTag("toolchain-user")
class GccCrossSelfTest(GccSelfTestBase):
    def test_cross_gcc(self):
        self.run_check("gcc", "g++")

@OETestTag("toolchain-user")
class GccLibAtomicSelfTest(GccSelfTestBase):
    def test_libatomic(self):
        self.run_check("libatomic")

@OETestTag("toolchain-user")
class GccLibGompSelfTest(GccSelfTestBase):
    def test_libgomp(self):
        self.run_check("libgomp")

@OETestTag("toolchain-user")
class GccLibStdCxxSelfTest(GccSelfTestBase):
    def test_libstdcxx(self):
        self.run_check("libstdc++-v3")

@OETestTag("toolchain-user")
class GccLibSspSelfTest(GccSelfTestBase):
    def test_libssp(self):
        self.check_skip("libssp")
        self.run_check("libssp")

@OETestTag("toolchain-user")
class GccLibItmSelfTest(GccSelfTestBase):
    def test_libitm(self):
        self.check_skip("libitm")
        self.run_check("libitm")

@OETestTag("toolchain-system")
class GccCrossSelfTestSystemEmulated(GccSelfTestBase):
    def test_cross_gcc(self):
        self.run_check_emulated("gcc", "g++")

@OETestTag("toolchain-system")
class GccLibAtomicSelfTestSystemEmulated(GccSelfTestBase):
    def test_libatomic(self):
        self.run_check_emulated("libatomic")

@OETestTag("toolchain-system")
class GccLibGompSelfTestSystemEmulated(GccSelfTestBase):
    def test_libgomp(self):
        self.run_check_emulated("libgomp")

@OETestTag("toolchain-system")
class GccLibStdCxxSelfTestSystemEmulated(GccSelfTestBase):
    def test_libstdcxx(self):
        self.run_check_emulated("libstdc++-v3")

@OETestTag("toolchain-system")
class GccLibSspSelfTestSystemEmulated(GccSelfTestBase):
    def test_libssp(self):
        self.check_skip("libssp")
        self.run_check_emulated("libssp")

@OETestTag("toolchain-system")
class GccLibItmSelfTestSystemEmulated(GccSelfTestBase):
    def test_libitm(self):
        self.check_skip("libitm")
        self.run_check_emulated("libitm")

