summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/buildperf/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oeqa/buildperf/base.py')
-rw-r--r--meta/lib/oeqa/buildperf/base.py78
1 files changed, 77 insertions, 1 deletions
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)