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