From ce8cf3dcefb0a432381a4461b930a0a56ad22292 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Wed, 20 Feb 2013 19:05:44 -0800 Subject: Use a fake coverage module instead of real one. Actually loading the coverage module was leading to odd concurrency conditions where it was interfering with mocked calls. This changes to stub out the coverage class with a fake one so that we don't have to worry about collisions. It also modifies the coverage class to be created lazily so it isn't automatically started at import time. Finally it removes the hack in run_tests.sh ignoring the coverage tests. Fixes bug 1131023 Change-Id: I39de434454f8b0903f6311e731e215a93027bc91 --- nova/api/openstack/compute/contrib/coverage_ext.py | 21 ++++++++++------- .../openstack/compute/contrib/test_coverage_ext.py | 26 +++++++++++++++++----- nova/tests/integrated/test_api_samples.py | 3 ++- run_tests.sh | 4 ---- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/nova/api/openstack/compute/contrib/coverage_ext.py b/nova/api/openstack/compute/contrib/coverage_ext.py index 6edf9244f..6eeb363f2 100644 --- a/nova/api/openstack/compute/contrib/coverage_ext.py +++ b/nova/api/openstack/compute/contrib/coverage_ext.py @@ -45,7 +45,6 @@ class CoverageController(object): """The Coverage report API controller for the OpenStack API.""" def __init__(self): self.data_path = tempfile.mkdtemp(prefix='nova-coverage_') - data_out = os.path.join(self.data_path, '.nova-coverage') self.compute_api = compute_api.API() self.network_api = network_api.API() self.conductor_api = conductor_api.API() @@ -55,14 +54,20 @@ class CoverageController(object): self.cert_api = cert_api.CertAPI() self.services = [] self.combine = False - try: - import coverage - self.coverInst = coverage.coverage(data_file=data_out) - self.has_coverage = True - except ImportError: - self.has_coverage = False + self._cover_inst = None super(CoverageController, self).__init__() + @property + def coverInst(self): + if not self._cover_inst: + try: + import coverage + data_out = os.path.join(self.data_path, '.nova-coverage') + self._cover_inst = coverage.coverage(data_file=data_out) + except ImportError: + pass + return self._cover_inst + def _find_services(self, req): """Returns a list of services.""" context = req.environ['nova.context'] @@ -242,7 +247,7 @@ class CoverageController(object): 'report': self._report_coverage, } authorize(req.environ['nova.context']) - if not self.has_coverage: + if not self.coverInst: msg = _("Python coverage module is not installed.") raise exc.HTTPServiceUnavailable(explanation=msg) for action, data in body.iteritems(): diff --git a/nova/tests/api/openstack/compute/contrib/test_coverage_ext.py b/nova/tests/api/openstack/compute/contrib/test_coverage_ext.py index 66a8a8f82..3c37fe10b 100644 --- a/nova/tests/api/openstack/compute/contrib/test_coverage_ext.py +++ b/nova/tests/api/openstack/compute/contrib/test_coverage_ext.py @@ -34,12 +34,27 @@ def fake_check_coverage(self): return False -def fake_xml_report(self, outfile): - return +class FakeCoverage(object): + def __init__(self, data_file=None): + self.started = False + return super(FakeCoverage, self).__init__() + def save(self): + pass -def fake_report(self, file): - return + def start(self): + self.started = True + + def stop(self): + if not self.started: + raise AssertionError + self.started = False + + def report(self, file): + pass + + def xml_report(self, outfile): + pass class CoverageExtensionTest(test.TestCase): @@ -48,8 +63,7 @@ class CoverageExtensionTest(test.TestCase): super(CoverageExtensionTest, self).setUp() self.stubs.Set(telnetlib.Telnet, 'write', fake_telnet) self.stubs.Set(telnetlib.Telnet, 'expect', fake_telnet) - self.stubs.Set(coverage.coverage, 'report', fake_report) - self.stubs.Set(coverage.coverage, 'xml_report', fake_xml_report) + self.stubs.Set(coverage, 'coverage', FakeCoverage) self.admin_context = context.RequestContext('fakeadmin_0', 'fake', is_admin=True) diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py index 474e0aa22..7b964fa76 100644 --- a/nova/tests/integrated/test_api_samples.py +++ b/nova/tests/integrated/test_api_samples.py @@ -46,6 +46,7 @@ import nova.quota from nova.scheduler import driver from nova.servicegroup import api as service_group_api from nova import test +from nova.tests.api.openstack.compute.contrib import test_coverage_ext from nova.tests.api.openstack.compute.contrib import test_fping from nova.tests.api.openstack.compute.contrib import test_networks from nova.tests.api.openstack.compute.contrib import test_services @@ -759,7 +760,7 @@ class CoverageExtJsonTests(ApiSampleTestBase): self.stubs.Set(coverage_ext.CoverageController, '_check_coverage', _fake_check_coverage) - self.stubs.Set(coverage.coverage, 'xml_report', _fake_xml_report) + self.stubs.Set(coverage, 'coverage', test_coverage_ext.FakeCoverage) def test_start_coverage(self): # Start coverage data collection. diff --git a/run_tests.sh b/run_tests.sh index 9872858b4..68a564754 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -110,10 +110,6 @@ function run_tests { ${wrapper} find . -type f -name "*.pyc" -delete if [ $coverage -eq 1 ]; then - # Do not test test_coverage_ext when gathering coverage. - if [ "x$testrargs" = "x" ]; then - testrargs="^(?!.*test.*coverage).*$" - fi TESTRTESTS="$TESTRTESTS --coverage" else TESTRTESTS="$TESTRTESTS --slowest" -- cgit