oeqa.buildperf: add BuildPerfTest class

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.

(From OE-Core rev: 35cd7363759a286e80ddca0d028db3d2bf524b17)

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Markus Lehtonen 2016-05-11 13:22:50 +03:00 committed by Richard Purdie
parent cee685ca0d
commit 1b10ded015
2 changed files with 78 additions and 2 deletions

View File

@ -10,4 +10,4 @@
# more details.
#
"""Build performance tests"""
from .base import KernelDropCaches
from .base import BuildPerfTest, KernelDropCaches

View File

@ -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)