1#
2# Copyright OpenEmbedded Contributors
3#
4# SPDX-License-Identifier: MIT
5#
6
7import tempfile
8import shutil
9import os
10import glob
11import time
12from oeqa.selftest.case import OESelftestTestCase
13from oeqa.utils.commands import runCmd, bitbake, get_bb_vars
14
15class oeSDKExtSelfTest(OESelftestTestCase):
16    """
17    # Bugzilla Test Plan: 6033
18    # This code is planned to be part of the automation for eSDK containig
19    # Install libraries and headers, image generation binary feeds, sdk-update.
20    """
21
22    @staticmethod
23    def get_esdk_environment(env_eSDK, tmpdir_eSDKQA):
24        # XXX: at this time use the first env need to investigate
25        # what environment load oe-selftest, i586, x86_64
26        pattern = os.path.join(tmpdir_eSDKQA, 'environment-setup-*')
27        return glob.glob(pattern)[0]
28
29    @staticmethod
30    def run_esdk_cmd(env_eSDK, tmpdir_eSDKQA, cmd, postconfig=None, **options):
31        if postconfig:
32            esdk_conf_file = os.path.join(tmpdir_eSDKQA, 'conf', 'local.conf')
33            with open(esdk_conf_file, 'a+') as f:
34                f.write(postconfig)
35        if not options:
36            options = {}
37        if not 'shell' in options:
38            options['shell'] = True
39
40        runCmd("cd %s; unset BBPATH; unset BUILDDIR; . %s; %s" % (tmpdir_eSDKQA, env_eSDK, cmd), **options)
41
42    @staticmethod
43    def generate_eSDK(image):
44        pn_task = '%s -c populate_sdk_ext' % image
45        bitbake(pn_task)
46
47    @staticmethod
48    def get_eSDK_toolchain(image):
49        pn_task = '%s -c populate_sdk_ext' % image
50
51        bb_vars = get_bb_vars(['SDK_DEPLOY', 'TOOLCHAINEXT_OUTPUTNAME'], pn_task)
52        sdk_deploy = bb_vars['SDK_DEPLOY']
53        toolchain_name = bb_vars['TOOLCHAINEXT_OUTPUTNAME']
54        return os.path.join(sdk_deploy, toolchain_name + '.sh')
55
56    @staticmethod
57    def update_configuration(cls, image, tmpdir_eSDKQA, env_eSDK, ext_sdk_path):
58        sstate_dir = os.path.join(os.environ['BUILDDIR'], 'sstate-cache')
59
60        oeSDKExtSelfTest.generate_eSDK(cls.image)
61
62        cls.ext_sdk_path = oeSDKExtSelfTest.get_eSDK_toolchain(cls.image)
63        runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA))
64
65        cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA)
66
67        sstate_config="""
68ESDK_LOCALCONF_ALLOW = "SSTATE_MIRRORS"
69SSTATE_MIRRORS =  "file://.* file://%s/PATH"
70CORE_IMAGE_EXTRA_INSTALL = "perl"
71        """ % sstate_dir
72
73        with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f:
74            f.write(sstate_config)
75
76    @classmethod
77    def setUpClass(cls):
78        super(oeSDKExtSelfTest, cls).setUpClass()
79        cls.image = 'core-image-minimal'
80
81        bb_vars = get_bb_vars(['SSTATE_DIR', 'WORKDIR'], cls.image)
82        bb.utils.mkdirhier(bb_vars["WORKDIR"])
83        cls.tmpdirobj = tempfile.TemporaryDirectory(prefix="selftest-esdk-", dir=bb_vars["WORKDIR"])
84        cls.tmpdir_eSDKQA = cls.tmpdirobj.name
85
86        oeSDKExtSelfTest.generate_eSDK(cls.image)
87
88        # Install eSDK
89        cls.ext_sdk_path = oeSDKExtSelfTest.get_eSDK_toolchain(cls.image)
90        runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA))
91
92        cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA)
93
94        # Configure eSDK to use sstate mirror from poky
95        sstate_config="""
96ESDK_LOCALCONF_ALLOW = "SSTATE_MIRRORS"
97SSTATE_MIRRORS =  "file://.* file://%s/PATH"
98            """ % bb_vars["SSTATE_DIR"]
99        with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f:
100            f.write(sstate_config)
101
102    @classmethod
103    def tearDownClass(cls):
104        for i in range(0, 10):
105            if os.path.exists(os.path.join(cls.tmpdir_eSDKQA, 'bitbake.lock')) or os.path.exists(os.path.join(cls.tmpdir_eSDKQA, 'cache/hashserv.db-wal')):
106                time.sleep(1)
107            else:
108                break
109        cls.tmpdirobj.cleanup()
110        super().tearDownClass()
111
112    def test_install_libraries_headers(self):
113        pn_sstate = 'bc'
114        bitbake(pn_sstate)
115        cmd = "devtool sdk-install %s " % pn_sstate
116        oeSDKExtSelfTest.run_esdk_cmd(self.env_eSDK, self.tmpdir_eSDKQA, cmd)
117
118    def test_image_generation_binary_feeds(self):
119        image = 'core-image-minimal'
120        cmd = "devtool build-image %s" % image
121        oeSDKExtSelfTest.run_esdk_cmd(self.env_eSDK, self.tmpdir_eSDKQA, cmd)
122
123