]> code.ossystems Code Review - openembedded-core.git/commitdiff
oeqa.buildperf: add BuildPerfTest class
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Wed, 11 May 2016 10:22:50 +0000 (13:22 +0300)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 1 Jul 2016 15:08:49 +0000 (16:08 +0100)
The new class will be used as an abstract base class for build
performance tests. This implementation contains some common
functionality used in multiple tests, "copied" from the
build-perf-test.sh shell script.

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
meta/lib/oeqa/buildperf/__init__.py
meta/lib/oeqa/buildperf/base.py

index bab122e4ec39cd722c10ed33c453ce6f3e554bb4..3bee5b902822a05e505d2e18e113609394fc399d 100644 (file)
@@ -10,4 +10,4 @@
 # more details.
 #
 """Build performance tests"""
-from .base import KernelDropCaches
+from .base import BuildPerfTest, KernelDropCaches
index 3cbdfa7818f655bf1a9f001a46dcd9f8a4743d01..3ef038494f9c936762fc20ec0730656912d545ab 100644 (file)
 # 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)