1*4882a593Smuzhiyun# Copyright (c) 2016, Intel Corporation. 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun"""Basic set of build performance tests""" 6*4882a593Smuzhiyunimport os 7*4882a593Smuzhiyunimport shutil 8*4882a593Smuzhiyun 9*4882a593Smuzhiyunimport oe.path 10*4882a593Smuzhiyunfrom oeqa.buildperf import BuildPerfTestCase 11*4882a593Smuzhiyunfrom oeqa.utils.commands import get_bb_var, get_bb_vars 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunclass Test1P1(BuildPerfTestCase): 14*4882a593Smuzhiyun build_target = 'core-image-sato' 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun def test1(self): 17*4882a593Smuzhiyun """Build core-image-sato""" 18*4882a593Smuzhiyun self.rm_tmp() 19*4882a593Smuzhiyun self.rm_sstate() 20*4882a593Smuzhiyun self.rm_cache() 21*4882a593Smuzhiyun self.sync() 22*4882a593Smuzhiyun self.measure_cmd_resources(['bitbake', self.build_target], 'build', 23*4882a593Smuzhiyun 'bitbake ' + self.build_target, save_bs=True) 24*4882a593Smuzhiyun self.measure_disk_usage(self.bb_vars['TMPDIR'], 'tmpdir', 'tmpdir') 25*4882a593Smuzhiyun self.measure_disk_usage(get_bb_var("IMAGE_ROOTFS", self.build_target), 'rootfs', 'rootfs', True) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun 28*4882a593Smuzhiyunclass Test1P2(BuildPerfTestCase): 29*4882a593Smuzhiyun build_target = 'virtual/kernel' 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun def test12(self): 32*4882a593Smuzhiyun """Build virtual/kernel""" 33*4882a593Smuzhiyun # Build and cleans state in order to get all dependencies pre-built 34*4882a593Smuzhiyun self.run_cmd(['bitbake', self.build_target]) 35*4882a593Smuzhiyun self.run_cmd(['bitbake', self.build_target, '-c', 'cleansstate']) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun self.sync() 38*4882a593Smuzhiyun self.measure_cmd_resources(['bitbake', self.build_target], 'build', 39*4882a593Smuzhiyun 'bitbake ' + self.build_target) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunclass Test1P3(BuildPerfTestCase): 43*4882a593Smuzhiyun build_target = 'core-image-sato' 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun def test13(self): 46*4882a593Smuzhiyun """Build core-image-sato with rm_work enabled""" 47*4882a593Smuzhiyun postfile = os.path.join(self.tmp_dir, 'postfile.conf') 48*4882a593Smuzhiyun with open(postfile, 'w') as fobj: 49*4882a593Smuzhiyun fobj.write('INHERIT += "rm_work"\n') 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun self.rm_tmp() 52*4882a593Smuzhiyun self.rm_sstate() 53*4882a593Smuzhiyun self.rm_cache() 54*4882a593Smuzhiyun self.sync() 55*4882a593Smuzhiyun cmd = ['bitbake', '-R', postfile, self.build_target] 56*4882a593Smuzhiyun self.measure_cmd_resources(cmd, 'build', 57*4882a593Smuzhiyun 'bitbake' + self.build_target, 58*4882a593Smuzhiyun save_bs=True) 59*4882a593Smuzhiyun self.measure_disk_usage(self.bb_vars['TMPDIR'], 'tmpdir', 'tmpdir') 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun 62*4882a593Smuzhiyunclass Test2(BuildPerfTestCase): 63*4882a593Smuzhiyun build_target = 'core-image-sato' 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun def test2(self): 66*4882a593Smuzhiyun """Run core-image-sato do_rootfs with sstate""" 67*4882a593Smuzhiyun # Build once in order to populate sstate cache 68*4882a593Smuzhiyun self.run_cmd(['bitbake', self.build_target]) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun self.rm_tmp() 71*4882a593Smuzhiyun self.rm_cache() 72*4882a593Smuzhiyun self.sync() 73*4882a593Smuzhiyun cmd = ['bitbake', self.build_target, '-c', 'rootfs'] 74*4882a593Smuzhiyun self.measure_cmd_resources(cmd, 'do_rootfs', 'bitbake do_rootfs') 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun 77*4882a593Smuzhiyunclass Test3(BuildPerfTestCase): 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun def test3(self): 80*4882a593Smuzhiyun """Bitbake parsing (bitbake -p)""" 81*4882a593Smuzhiyun # Drop all caches and parse 82*4882a593Smuzhiyun self.rm_cache() 83*4882a593Smuzhiyun oe.path.remove(os.path.join(self.bb_vars['TMPDIR'], 'cache'), True) 84*4882a593Smuzhiyun self.measure_cmd_resources(['bitbake', '-p'], 'parse_1', 85*4882a593Smuzhiyun 'bitbake -p (no caches)') 86*4882a593Smuzhiyun # Drop tmp/cache 87*4882a593Smuzhiyun oe.path.remove(os.path.join(self.bb_vars['TMPDIR'], 'cache'), True) 88*4882a593Smuzhiyun self.measure_cmd_resources(['bitbake', '-p'], 'parse_2', 89*4882a593Smuzhiyun 'bitbake -p (no tmp/cache)') 90*4882a593Smuzhiyun # Parse with fully cached data 91*4882a593Smuzhiyun self.measure_cmd_resources(['bitbake', '-p'], 'parse_3', 92*4882a593Smuzhiyun 'bitbake -p (cached)') 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun 95*4882a593Smuzhiyunclass Test4(BuildPerfTestCase): 96*4882a593Smuzhiyun build_target = 'core-image-sato' 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun def test4(self): 99*4882a593Smuzhiyun """eSDK metrics""" 100*4882a593Smuzhiyun self.run_cmd(['bitbake', '-c', 'do_populate_sdk_ext', 101*4882a593Smuzhiyun self.build_target]) 102*4882a593Smuzhiyun self.bb_vars = get_bb_vars(None, self.build_target) 103*4882a593Smuzhiyun tmp_dir = self.bb_vars['TMPDIR'] 104*4882a593Smuzhiyun installer = os.path.join( 105*4882a593Smuzhiyun self.bb_vars['SDK_DEPLOY'], 106*4882a593Smuzhiyun self.bb_vars['TOOLCHAINEXT_OUTPUTNAME'] + '.sh') 107*4882a593Smuzhiyun # Measure installer size 108*4882a593Smuzhiyun self.measure_disk_usage(installer, 'installer_bin', 'eSDK installer', 109*4882a593Smuzhiyun apparent_size=True) 110*4882a593Smuzhiyun # Measure deployment time and deployed size 111*4882a593Smuzhiyun deploy_dir = os.path.join(tmp_dir, 'esdk-deploy') 112*4882a593Smuzhiyun if os.path.exists(deploy_dir): 113*4882a593Smuzhiyun shutil.rmtree(deploy_dir) 114*4882a593Smuzhiyun self.sync() 115*4882a593Smuzhiyun self.measure_cmd_resources([installer, '-y', '-d', deploy_dir], 116*4882a593Smuzhiyun 'deploy', 'eSDK deploy') 117*4882a593Smuzhiyun #make sure bitbake is unloaded 118*4882a593Smuzhiyun self.sync() 119*4882a593Smuzhiyun self.measure_disk_usage(deploy_dir, 'deploy_dir', 'deploy dir', 120*4882a593Smuzhiyun apparent_size=True) 121