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