aboutsummaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/buildperf/test_basic.py
blob: ada5aba0531fdd465ce7486b448b1df5ce4c5b46 (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
126
127
128
129
130
131
132
133
# 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

from . import BuildPerfTest, perf_test_case
from oeqa.utils.commands import get_bb_vars


@perf_test_case
class Test1P1(BuildPerfTest):
    name = "test1"
    build_target = 'core-image-sato'
    description = "Measure wall clock of bitbake {} and size of tmp dir".format(build_target)

    def _run(self):
        self.log_cmd_output("bitbake {} -c fetchall".format(self.build_target))
        self.rm_tmp()
        self.rm_sstate()
        self.rm_cache()
        self.sync()
        self.measure_cmd_resources(['bitbake', self.build_target], 'build',
                                   'bitbake ' + self.build_target)
        self.measure_disk_usage(self.bb_vars['TMPDIR'], 'tmpdir', 'tmpdir')
        self.save_buildstats()


@perf_test_case
class Test1P2(BuildPerfTest):
    name = "test12"
    build_target = 'virtual/kernel'
    description = "Measure bitbake {}".format(build_target)

    def _run(self):
        self.log_cmd_output("bitbake {} -c cleansstate".format(
            self.build_target))
        self.sync()
        self.measure_cmd_resources(['bitbake', self.build_target], 'build',
                                   'bitbake ' + self.build_target)


@perf_test_case
class Test1P3(BuildPerfTest):
    name = "test13"
    build_target = 'core-image-sato'
    description = "Build {} with rm_work enabled".format(build_target)

    def _run(self):
        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)
            self.measure_disk_usage(self.bb_vars['TMPDIR'], 'tmpdir', 'tmpdir')
        finally:
            os.unlink(postfile)
        self.save_buildstats()


@perf_test_case
class Test2(BuildPerfTest):
    name = "test2"
    build_target = 'core-image-sato'
    description = "Measure bitbake {} -c rootfs with sstate".format(build_target)

    def _run(self):
        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')


@perf_test_case
class Test3(BuildPerfTest):
    name = "test3"
    description = "Parsing time metrics (bitbake -p)"

    def _run(self):
        # Drop all caches and parse
        self.rm_cache()
        self.force_rm(os.path.join(self.bb_vars['TMPDIR'], 'cache'))
        self.measure_cmd_resources(['bitbake', '-p'], 'parse_1',
                                   'bitbake -p (no caches)')
        # Drop tmp/cache
        self.force_rm(os.path.join(self.bb_vars['TMPDIR'], 'cache'))
        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)')


@perf_test_case
class Test4(BuildPerfTest):
    name = "test4"
    build_target = 'core-image-sato'
    description = "eSDK metrics"

    def _run(self):
        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')