#
# SPDX-License-Identifier: MIT
#

import glob
import os
import shutil
import tempfile
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import runCmd, bitbake, get_bb_vars


class oeGoToolchainSelfTest(OESelftestTestCase):
    """
    Test cases for OE's Go toolchain
    """

    @staticmethod
    def get_sdk_environment(tmpdir_SDKQA):
        pattern = os.path.join(tmpdir_SDKQA, "environment-setup-*")
        # FIXME: this is a very naive implementation
        return glob.glob(pattern)[0]

    @staticmethod
    def get_sdk_toolchain():
        bb_vars = get_bb_vars(['SDK_DEPLOY', 'TOOLCHAIN_OUTPUTNAME'],
                              "meta-go-toolchain")
        sdk_deploy = bb_vars['SDK_DEPLOY']
        toolchain_name = bb_vars['TOOLCHAIN_OUTPUTNAME']
        return os.path.join(sdk_deploy, toolchain_name + ".sh")

    @classmethod
    def setUpClass(cls):
        super(oeGoToolchainSelfTest, cls).setUpClass()
        cls.tmpdir_SDKQA = tempfile.mkdtemp(prefix='SDKQA')
        cls.go_path = os.path.join(cls.tmpdir_SDKQA, "go")
        # Build the SDK and locate it in DEPLOYDIR
        bitbake("meta-go-toolchain")
        cls.sdk_path = oeGoToolchainSelfTest.get_sdk_toolchain()
        # Install the SDK into the tmpdir
        runCmd("sh %s -y -d \"%s\"" % (cls.sdk_path, cls.tmpdir_SDKQA))
        cls.env_SDK = oeGoToolchainSelfTest.get_sdk_environment(cls.tmpdir_SDKQA)

    @classmethod
    def tearDownClass(cls):
        # Go creates file which are readonly
        for dirpath, dirnames, filenames in os.walk(cls.tmpdir_SDKQA):
            for filename in filenames + dirnames:
                f = os.path.join(dirpath, filename)
                if not os.path.islink(f):
                    os.chmod(f, 0o775)
        shutil.rmtree(cls.tmpdir_SDKQA, ignore_errors=True)
        super(oeGoToolchainSelfTest, cls).tearDownClass()

    def run_sdk_go_command(self, gocmd, proj, name):
        cmd = "cd %s/src/%s/%s; " % (self.go_path, proj, name)
        cmd = cmd + ". %s; " % self.env_SDK
        cmd = cmd + "export GOPATH=%s; " % self.go_path
        cmd = cmd + "${CROSS_COMPILE}go %s" % gocmd
        return runCmd(cmd).status

    def test_go_dep_build(self):
        proj = "github.com/direnv"
        name = "direnv"
        ver = "v2.27.0"
        archive = ".tar.gz"
        url = "https://%s/%s/archive/%s%s" % (proj, name, ver, archive)

        runCmd("cd %s; wget %s" % (self.tmpdir_SDKQA, url))
        runCmd("cd %s; tar -xf %s" % (self.tmpdir_SDKQA, ver+archive))
        runCmd("mkdir -p %s/src/%s" % (self.go_path, proj))
        runCmd("mv %s/direnv-2.27.0 %s/src/%s/%s"
               % (self.tmpdir_SDKQA, self.go_path, proj, name))
        retv = self.run_sdk_go_command('build', proj, name)
        self.assertEqual(retv, 0,
                         msg="Running go build failed for %s" % name)
