diff options
Diffstat (limited to 'meta/lib')
-rw-r--r-- | meta/lib/oeqa/buildperf/__init__.py | 2 | ||||
-rw-r--r-- | meta/lib/oeqa/buildperf/base.py | 78 |
2 files changed, 78 insertions, 2 deletions
diff --git a/meta/lib/oeqa/buildperf/__init__.py b/meta/lib/oeqa/buildperf/__init__.py index bab122e4ec..3bee5b9028 100644 --- a/meta/lib/oeqa/buildperf/__init__.py +++ b/meta/lib/oeqa/buildperf/__init__.py @@ -10,4 +10,4 @@ # more details. # """Build performance tests""" -from .base import KernelDropCaches +from .base import BuildPerfTest, KernelDropCaches diff --git a/meta/lib/oeqa/buildperf/base.py b/meta/lib/oeqa/buildperf/base.py index 3cbdfa7818..3ef038494f 100644 --- a/meta/lib/oeqa/buildperf/base.py +++ b/meta/lib/oeqa/buildperf/base.py @@ -10,7 +10,16 @@ # more details. # """Build performance test base classes and functionality""" -from oeqa.utils.commands import runCmd +import logging +import os +import shutil +import time +from datetime import datetime + +from oeqa.utils.commands import runCmd, get_bb_vars + +# Get logger for this module +log = logging.getLogger('build-perf') class KernelDropCaches(object): @@ -44,3 +53,70 @@ class KernelDropCaches(object): cmd += ['tee', '/proc/sys/vm/drop_caches'] input_data += b'3' runCmd(cmd, data=input_data) + + +class BuildPerfTest(object): + """Base class for build performance tests""" + name = None + description = None + + def __init__(self, out_dir): + self.out_dir = out_dir + self.results = {'name':self.name, + 'description': self.description, + 'status': 'NOTRUN', + 'start_time': None, + 'elapsed_time': None, + 'measurements': []} + if not os.path.exists(self.out_dir): + os.makedirs(self.out_dir) + if not self.name: + self.name = self.__class__.__name__ + self.bb_vars = get_bb_vars() + + def run(self): + """Run test""" + self.results['status'] = 'FAILED' + self.results['start_time'] = datetime.now() + self._run() + self.results['elapsed_time'] = (datetime.now() - + self.results['start_time']) + # Test is regarded as completed if it doesn't raise an exception + self.results['status'] = 'COMPLETED' + + def _run(self): + """Actual test payload""" + raise NotImplementedError + + @staticmethod + def force_rm(path): + """Equivalent of 'rm -rf'""" + if os.path.isfile(path) or os.path.islink(path): + os.unlink(path) + elif os.path.isdir(path): + shutil.rmtree(path) + + def rm_tmp(self): + """Cleanup temporary/intermediate files and directories""" + log.debug("Removing temporary and cache files") + for name in ['bitbake.lock', 'conf/sanity_info', + self.bb_vars['TMPDIR']]: + self.force_rm(name) + + def rm_sstate(self): + """Remove sstate directory""" + log.debug("Removing sstate-cache") + self.force_rm(self.bb_vars['SSTATE_DIR']) + + def rm_cache(self): + """Drop bitbake caches""" + self.force_rm(self.bb_vars['PERSISTENT_DIR']) + + @staticmethod + def sync(): + """Sync and drop kernel caches""" + log.debug("Syncing and dropping kernel caches""") + KernelDropCaches.drop() + os.sync() + # Wait a bit for all the dirty blocks to be written onto disk + time.sleep(3) |