summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/buildperf/test_basic.py
blob: e448ed18c90af50baea357de9f8a3dba2d2e0755 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Copyright (c) 2016, Intel Corporation.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
# version 2, as published by the Free Software Foundation.
#
# This program is distributed in the hope it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
# more details.
#
"""Basic set of build performance tests"""
import os
import shutil

import oe.path
from oeqa.buildperf import BuildPerfTestCase
from oeqa.utils.commands import get_bb_vars


class Test1P1(BuildPerfTestCase):
    build_target = 'core-image-sato'

    def test1(self):
        """Measure wall clock of bitbake core-image-sato and size of tmp dir"""
        self.rm_tmp()
        self.rm_sstate()
        self.rm_cache()
        self.sync()
        self.measure_cmd_resources(['bitbake', self.build_target], 'build',
                                   'bitbake ' + self.build_target, save_bs=True)
        self.measure_disk_usage(self.bb_vars['TMPDIR'], 'tmpdir', 'tmpdir')


class Test1P2(BuildPerfTestCase):
    build_target = 'virtual/kernel'

    def test12(self):
        """Measure bitbake virtual/kernel"""
        # Build and cleans state in order to get all dependencies pre-built
        self.log_cmd_output(['bitbake', self.build_target])
        self.log_cmd_output(['bitbake', self.build_target, '-c', 'cleansstate'])

        self.sync()
        self.measure_cmd_resources(['bitbake', self.build_target], 'build',
                                   'bitbake ' + self.build_target)


class Test1P3(BuildPerfTestCase):
    build_target = 'core-image-sato'

    def test13(self):
        """Build core-image-sato with rm_work enabled"""
        postfile = os.path.join(self.out_dir, 'postfile.conf')
        with open(postfile, 'w') as fobj:
            fobj.write('INHERIT += "rm_work"\n')
        try:
            self.rm_tmp()
            self.rm_sstate()
            self.rm_cache()
            self.sync()
            cmd = ['bitbake', '-R', postfile, self.build_target]
            self.measure_cmd_resources(cmd, 'build',
                                       'bitbake' + self.build_target,
                                       save_bs=True)
            self.measure_disk_usage(self.bb_vars['TMPDIR'], 'tmpdir', 'tmpdir')
        finally:
            os.unlink(postfile)


class Test2(BuildPerfTestCase):
    build_target = 'core-image-sato'

    def test2(self):
        """Measure bitbake core-image-sato -c rootfs with sstate"""
        # Build once in order to populate sstate cache
        self.log_cmd_output(['bitbake', self.build_target])

        self.rm_tmp()
        self.rm_cache()
        self.sync()
        cmd = ['bitbake', self.build_target, '-c', 'rootfs']
        self.measure_cmd_resources(cmd, 'do_rootfs', 'bitbake do_rootfs')


class Test3(BuildPerfTestCase):

    def test3(self):
        """Parsing time metrics (bitbake -p)"""
        # Drop all caches and parse
        self.rm_cache()
        oe.path.remove(os.path.join(self.bb_vars['TMPDIR'], 'cache'), True)
        self.measure_cmd_resources(['bitbake', '-p'], 'parse_1',
                                   'bitbake -p (no caches)')
        # Drop tmp/cache
        oe.path.remove(os.path.join(self.bb_vars['TMPDIR'], 'cache'), True)
        self.measure_cmd_resources(['bitbake', '-p'], 'parse_2',
                                   'bitbake -p (no tmp/cache)')
        # Parse with fully cached data
        self.measure_cmd_resources(['bitbake', '-p'], 'parse_3',
                                   'bitbake -p (cached)')


class Test4(BuildPerfTestCase):
    build_target = 'core-image-sato'

    def test4(self):
        """eSDK metrics"""
        self.log_cmd_output("bitbake {} -c do_populate_sdk_ext".format(
            self.build_target))
        self.bb_vars = get_bb_vars(None, self.build_target)
        tmp_dir = self.bb_vars['TMPDIR']
        installer = os.path.join(
            self.bb_vars['SDK_DEPLOY'],
            self.bb_vars['TOOLCHAINEXT_OUTPUTNAME'] + '.sh')
        # Measure installer size
        self.measure_disk_usage(installer, 'installer_bin', 'eSDK installer')
        # Measure deployment time and deployed size
        deploy_dir = os.path.join(tmp_dir, 'esdk-deploy')
        if os.path.exists(deploy_dir):
            shutil.rmtree(deploy_dir)
        self.sync()
        self.measure_cmd_resources([installer, '-y', '-d', deploy_dir],
                                   'deploy', 'eSDK deploy')
        self.measure_disk_usage(deploy_dir, 'deploy_dir', 'deploy dir')