Yes, thanks for the heads up. I will send version 2. Humberto
From: Christopher Larson [mailto:clar...@kergoth.com] Sent: Tuesday, February 16, 2016 4:20 PM To: Ibarra Lopez, Humberto <humberto.ibarra.lo...@intel.com>; openembedded-core@lists.openembedded.org Subject: Re: [OE-core] [PATCH 2/2] scripts/oe-selftest: Use site.USER_SITE to run coverage configuration code for sub-process Shouldn't this use a try/finally to ensure the user's site area is properly cleaned up if coverage_report() raises an exception? I doubt you want to risk leaving that around. On Tue, Feb 16, 2016 at 1:10 PM <humberto.ibarra.lo...@intel.com<mailto:humberto.ibarra.lo...@intel.com>> wrote: From: Humberto Ibarra <humberto.ibarra.lo...@intel.com<mailto:humberto.ibarra.lo...@intel.com>> 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.lo...@intel.com<mailto:humberto.ibarra.lo...@intel.com>> --- scripts/oe-selftest | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/scripts/oe-selftest b/scripts/oe-selftest index f3865e4..3159d22 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<http://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<http://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 """ @@ -601,6 +617,11 @@ def buildResultClass(args): log.info<http://log.info>("===============") coverage_report() + # remove the pth file + try: + os.remove(self.coveragepth) + except OSError: + pass return StampedResult -- 1.9.1 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org<mailto:Openembedded-core@lists.openembedded.org> http://lists.openembedded.org/mailman/listinfo/openembedded-core
-- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core