diff options
author | Humberto Ibarra <humberto.ibarra.lopez@intel.com> | 2016-02-19 15:29:32 -0600 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-02-28 11:32:33 +0000 |
commit | 3f9b1658d745b536eff1017b2c74a9dff46b6f4a (patch) | |
tree | 9b909d60e679b29b17e5d72196c0669ff865a315 | |
parent | 923481c7d8c09ed9b03109cf4debcc6b07845c59 (diff) | |
download | openembedded-core-3f9b1658d745b536eff1017b2c74a9dff46b6f4a.tar.gz openembedded-core-3f9b1658d745b536eff1017b2c74a9dff46b6f4a.tar.bz2 openembedded-core-3f9b1658d745b536eff1017b2c74a9dff46b6f4a.zip |
scripts/oe-selftest: Use site.USER_SITE to run coverage configuration code for sub-process
Coverage in oe-selftest currently requires to create or modify
a sitecustomize.py file according the coverage tool setup instructions
(http://coverage.readthedocs.org/). This file has to be located in
the system's python folder, which is not a good solution since this
folder is not accesible to non-privileged users.
The best solution so far is to create this file in the home directory.
This is implemented by creating the temporal file in the user site
default folder.
[Yocto #8930]
Signed-off-by: Humberto Ibarra <humberto.ibarra.lopez@intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
-rwxr-xr-x | scripts/oe-selftest | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/scripts/oe-selftest b/scripts/oe-selftest index f3865e4e81..bd9cbe0826 100755 --- a/scripts/oe-selftest +++ b/scripts/oe-selftest @@ -553,6 +553,7 @@ def main(): def buildResultClass(args): """Build a Result Class to use in the testcase execution""" + import site class StampedResult(unittest.TextTestResult): """ @@ -568,26 +569,41 @@ def buildResultClass(args): def startTestRun(self): """ Setup coverage before running any testcase """ + + # variable holding the coverage configuration file allowing subprocess to be measured + self.coveragepth = None + + # indicates the system if coverage is currently installed + self.coverage_installed = True + if args.coverage or args.coverage_source or args.coverage_include or args.coverage_omit: try: # check if user can do coverage import coverage - log.info("Coverage is enabled") - - # In case the user has not set the variable COVERAGE_PROCESS_START, - # create a default one and export it. The COVERAGE_PROCESS_START - # value indicates where the coverage configuration file resides - # More info on https://pypi.python.org/pypi/coverage - if not os.environ.get('COVERAGE_PROCESS_START'): - os.environ['COVERAGE_PROCESS_START'] = coverage_setup(args.run_tests, args.run_all_tests, args.coverage_source, args.coverage_include, args.coverage_omit) - - self.coverage_installed = True except: log.warn('\n'.join(["python coverage is not installed", "Make sure your coverage takes into account sub-process", "More info on https://pypi.python.org/pypi/coverage"])) self.coverage_installed = False + if self.coverage_installed: + log.info("Coverage is enabled") + + # In case the user has not set the variable COVERAGE_PROCESS_START, + # create a default one and export it. The COVERAGE_PROCESS_START + # value indicates where the coverage configuration file resides + # More info on https://pypi.python.org/pypi/coverage + if not os.environ.get('COVERAGE_PROCESS_START'): + os.environ['COVERAGE_PROCESS_START'] = coverage_setup(args.run_tests, args.run_all_tests, args.coverage_source, args.coverage_include, args.coverage_omit) + + # Use default site.USER_SITE and write corresponding config file + site.ENABLE_USER_SITE = True + if not os.path.exists(site.USER_SITE): + os.makedirs(site.USER_SITE) + self.coveragepth = os.path.join(site.USER_SITE, "coverage.pth") + with open(self.coveragepth, 'w') as cps: + cps.write('import sys,site; sys.path.extend(site.getsitepackages()); import coverage; coverage.process_startup();') + def stopTestRun(self): """ Report coverage data after the testcases are run """ @@ -599,8 +615,14 @@ def buildResultClass(args): log.info("Coverage Report") log.info("===============") - - coverage_report() + try: + coverage_report() + # remove the pth file + finally: + try: + os.remove(self.coveragepth) + except OSError: + log.warn("Expected temporal file from coverage is missing, ignoring removal.") return StampedResult |