#
# 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):
        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 + "export GOFLAGS=-modcacherw; "
        cmd = cmd + "export CGO_ENABLED=1; "
        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)
