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