<div dir="ltr">Shouldn&#39;t this use a try/finally to ensure the user&#39;s site area is properly cleaned up if coverage_report() raises an exception? I doubt you want to risk leaving that around.</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Feb 16, 2016 at 1:10 PM &lt;<a href="mailto:humberto.ibarra.lopez@intel.com">humberto.ibarra.lopez@intel.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Humberto Ibarra &lt;<a href="mailto:humberto.ibarra.lopez@intel.com" target="_blank">humberto.ibarra.lopez@intel.com</a>&gt;<br>
<br>
Coverage in oe-selftest currently requires to create or modify<br>
a sitecustomize.py file according the coverage tool setup instructions<br>
(<a href="http://coverage.readthedocs.org/" rel="noreferrer" target="_blank">http://coverage.readthedocs.org/</a>). This file has to be located in<br>
the system&#39;s python folder, which is not a good solution since this<br>
folder is not accesible to non-privileged users.<br>
<br>
The best solution so far is to create this file in the home directory.<br>
This is implemented by creating the temporal file in the user site<br>
default folder.<br>
<br>
[Yocto #8930]<br>
<br>
Signed-off-by: Humberto Ibarra &lt;<a href="mailto:humberto.ibarra.lopez@intel.com" target="_blank">humberto.ibarra.lopez@intel.com</a>&gt;<br>
---<br>
 scripts/oe-selftest | 41 +++++++++++++++++++++++++++++++----------<br>
 1 file changed, 31 insertions(+), 10 deletions(-)<br>
<br>
diff --git a/scripts/oe-selftest b/scripts/oe-selftest<br>
index f3865e4..3159d22 100755<br>
--- a/scripts/oe-selftest<br>
+++ b/scripts/oe-selftest<br>
@@ -553,6 +553,7 @@ def main():<br>
<br>
 def buildResultClass(args):<br>
     &quot;&quot;&quot;Build a Result Class to use in the testcase execution&quot;&quot;&quot;<br>
+    import site<br>
<br>
     class StampedResult(unittest.TextTestResult):<br>
         &quot;&quot;&quot;<br>
@@ -568,26 +569,41 @@ def buildResultClass(args):<br>
<br>
         def startTestRun(self):<br>
             &quot;&quot;&quot; Setup coverage before running any testcase &quot;&quot;&quot;<br>
+<br>
+            # variable holding the coverage configuration file allowing subprocess to be measured<br>
+            self.coveragepth = None<br>
+<br>
+            # indicates the system if coverage is currently installed<br>
+            self.coverage_installed = True<br>
+<br>
             if args.coverage or args.coverage_source or args.coverage_include or args.coverage_omit:<br>
                 try:<br>
                     # check if user can do coverage<br>
                     import coverage<br>
-                    <a href="http://log.info" rel="noreferrer" target="_blank">log.info</a>(&quot;Coverage is enabled&quot;)<br>
-<br>
-                    # In case the user has not set the variable COVERAGE_PROCESS_START,<br>
-                    # create a default one and export it. The COVERAGE_PROCESS_START<br>
-                    # value indicates where the coverage configuration file resides<br>
-                    # More info on <a href="https://pypi.python.org/pypi/coverage" rel="noreferrer" target="_blank">https://pypi.python.org/pypi/coverage</a><br>
-                    if not os.environ.get(&#39;COVERAGE_PROCESS_START&#39;):<br>
-                        os.environ[&#39;COVERAGE_PROCESS_START&#39;] = coverage_setup(args.run_tests, args.run_all_tests, args.coverage_source, args.coverage_include, args.coverage_omit)<br>
-<br>
-                    self.coverage_installed = True<br>
                 except:<br>
                     log.warn(&#39;\n&#39;.join([&quot;python coverage is not installed&quot;,<br>
                         &quot;Make sure your coverage takes into account sub-process&quot;,<br>
                         &quot;More info on <a href="https://pypi.python.org/pypi/coverage" rel="noreferrer" target="_blank">https://pypi.python.org/pypi/coverage</a>&quot;]))<br>
                     self.coverage_installed = False<br>
<br>
+                if self.coverage_installed:<br>
+                    <a href="http://log.info" rel="noreferrer" target="_blank">log.info</a>(&quot;Coverage is enabled&quot;)<br>
+<br>
+                # In case the user has not set the variable COVERAGE_PROCESS_START,<br>
+                # create a default one and export it. The COVERAGE_PROCESS_START<br>
+                # value indicates where the coverage configuration file resides<br>
+                # More info on <a href="https://pypi.python.org/pypi/coverage" rel="noreferrer" target="_blank">https://pypi.python.org/pypi/coverage</a><br>
+                if not os.environ.get(&#39;COVERAGE_PROCESS_START&#39;):<br>
+                    os.environ[&#39;COVERAGE_PROCESS_START&#39;] = coverage_setup(args.run_tests, args.run_all_tests, args.coverage_source, args.coverage_include, args.coverage_omit)<br>
+<br>
+                # Use default site.USER_SITE and write corresponding config file<br>
+                site.ENABLE_USER_SITE = True<br>
+                if not os.path.exists(site.USER_SITE):<br>
+                    os.makedirs(site.USER_SITE)<br>
+                self.coveragepth = os.path.join(site.USER_SITE, &quot;coverage.pth&quot;)<br>
+                with open(self.coveragepth, &#39;w&#39;) as cps:<br>
+                    cps.write(&#39;import sys,site; sys.path.extend(site.getsitepackages()); import coverage; coverage.process_startup();&#39;)<br>
+<br>
         def stopTestRun(self):<br>
             &quot;&quot;&quot; Report coverage data after the testcases are run &quot;&quot;&quot;<br>
<br>
@@ -601,6 +617,11 @@ def buildResultClass(args):<br>
                 <a href="http://log.info" rel="noreferrer" target="_blank">log.info</a>(&quot;===============&quot;)<br>
<br>
                 coverage_report()<br>
+                # remove the pth file<br>
+                try:<br>
+                    os.remove(self.coveragepth)<br>
+                except OSError:<br>
+                    pass<br>
<br>
     return StampedResult<br>
<br>
--<br>
1.9.1<br>
<br>
--<br>
_______________________________________________<br>
Openembedded-core mailing list<br>
<a href="mailto:Openembedded-core@lists.openembedded.org" target="_blank">Openembedded-core@lists.openembedded.org</a><br>
<a href="http://lists.openembedded.org/mailman/listinfo/openembedded-core" rel="noreferrer" target="_blank">http://lists.openembedded.org/mailman/listinfo/openembedded-core</a><br>
</blockquote></div>