#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

from oeqa.selftest.case import OESelftestTestCase
from oeqa.sdk.utils.sdkbuildproject import SDKBuildProject
from oeqa.utils.commands import bitbake, get_bb_vars, runCmd
from oeqa.core.decorator import OETestTag
import tempfile
import shutil

@OETestTag("machine")
class MetaIDE(OESelftestTestCase):

    @classmethod
    def setUpClass(cls):
        super(MetaIDE, cls).setUpClass()
        bitbake('meta-ide-support')
        bitbake('build-sysroots')
        bb_vars = get_bb_vars(['MULTIMACH_TARGET_SYS', 'DEPLOY_DIR_IMAGE', 'COREBASE'])
        cls.environment_script = 'environment-setup-%s' % bb_vars['MULTIMACH_TARGET_SYS']
        cls.deploydir = bb_vars['DEPLOY_DIR_IMAGE']
        cls.environment_script_path = '%s/%s' % (cls.deploydir, cls.environment_script)
        cls.corebasedir = bb_vars['COREBASE']
        cls.tmpdir_metaideQA = tempfile.mkdtemp(prefix='metaide')

    @classmethod
    def tearDownClass(cls):
        shutil.rmtree(cls.tmpdir_metaideQA, ignore_errors=True)
        super(MetaIDE, cls).tearDownClass()

    def test_meta_ide_had_installed_meta_ide_support(self):
        self.assertExists(self.environment_script_path)

    def test_meta_ide_can_compile_c_program(self):
        runCmd('cp %s/test.c %s' % (self.tc.files_dir, self.tmpdir_metaideQA))
        runCmd("cd %s; . %s; $CC test.c -lm" % (self.tmpdir_metaideQA, self.environment_script_path))
        compiled_file = '%s/a.out' % self.tmpdir_metaideQA
        self.assertExists(compiled_file)

    def test_meta_ide_can_build_cpio_project(self):
        dl_dir = self.td.get('DL_DIR', None)
        self.project = SDKBuildProject(self.tmpdir_metaideQA + "/cpio/", self.environment_script_path,
                        "https://ftp.gnu.org/gnu/cpio/cpio-2.13.tar.gz",
                        self.tmpdir_metaideQA, self.td['DATETIME'], dl_dir=dl_dir)
        self.project.download_archive()
        self.assertEqual(self.project.run_configure('$CONFIGURE_FLAGS --disable-maintainer-mode','sed -i -e "/char \*program_name/d" src/global.c;'), 0,
                        msg="Running configure failed")
        self.assertEqual(self.project.run_make(), 0,
                        msg="Running make failed")
        self.assertEqual(self.project.run_install(), 0,
                        msg="Running make install failed")

    def test_meta_ide_can_run_sdk_tests(self):
        bitbake('-c populate_sysroot gtk+3')
        bitbake('build-sysroots')
        bitbake('-c testsdk meta-ide-support')
