Delete BaseTestCase and with it the last reference to tornado.
Requires commenting out some service_unittest tests which were silently failing under BaseTestCase and which now fail under TrialTestCase. vishy says he wrote the code and thinks he knows what is going wrong.
This commit is contained in:
parent
11802b76c0
commit
ba6d929320
156
nova/test.py
156
nova/test.py
@ -28,7 +28,6 @@ import time
|
||||
|
||||
import mox
|
||||
import stubout
|
||||
from tornado import ioloop
|
||||
from twisted.internet import defer
|
||||
from twisted.trial import unittest
|
||||
|
||||
@ -159,158 +158,3 @@ class TrialTestCase(unittest.TestCase):
|
||||
|
||||
_wrapped.func_name = self.originalAttach.func_name
|
||||
rpc.Consumer.attach_to_twisted = _wrapped
|
||||
|
||||
|
||||
class BaseTestCase(TrialTestCase):
|
||||
# TODO(jaypipes): Can this be moved into the TrialTestCase class?
|
||||
"""Base test case class for all unit tests.
|
||||
|
||||
DEPRECATED: This is being removed once Tornado is gone, use TrialTestCase.
|
||||
"""
|
||||
def setUp(self):
|
||||
"""Run before each test method to initialize test environment"""
|
||||
super(BaseTestCase, self).setUp()
|
||||
# TODO(termie): we could possibly keep a more global registry of
|
||||
# the injected listeners... this is fine for now though
|
||||
self.ioloop = ioloop.IOLoop.instance()
|
||||
|
||||
self._waiting = None
|
||||
self._done_waiting = False
|
||||
self._timed_out = False
|
||||
|
||||
def _wait_for_test(self, timeout=60):
|
||||
""" Push the ioloop along to wait for our test to complete. """
|
||||
self._waiting = self.ioloop.add_timeout(time.time() + timeout,
|
||||
self._timeout)
|
||||
|
||||
def _wait():
|
||||
|
||||
"""Wrapped wait function. Called on timeout."""
|
||||
if self._timed_out:
|
||||
self.fail('test timed out')
|
||||
self._done()
|
||||
if self._done_waiting:
|
||||
self.ioloop.stop()
|
||||
return
|
||||
# we can use add_callback here but this uses less cpu when testing
|
||||
self.ioloop.add_timeout(time.time() + 0.01, _wait)
|
||||
|
||||
self.ioloop.add_callback(_wait)
|
||||
self.ioloop.start()
|
||||
|
||||
def _done(self):
|
||||
"""Callback used for cleaning up deferred test methods."""
|
||||
if self._waiting:
|
||||
try:
|
||||
self.ioloop.remove_timeout(self._waiting)
|
||||
except Exception: # pylint: disable-msg=W0703
|
||||
# TODO(jaypipes): This produces a pylint warning. Should
|
||||
# we really be catching Exception and then passing here?
|
||||
pass
|
||||
self._waiting = None
|
||||
self._done_waiting = True
|
||||
|
||||
def _maybe_inline_callbacks(self, func):
|
||||
""" If we're doing async calls in our tests, wait on them.
|
||||
|
||||
This is probably the most complicated hunk of code we have so far.
|
||||
|
||||
First up, if the function is normal (not async) we just act normal
|
||||
and return.
|
||||
|
||||
Async tests will use the "Inline Callbacks" pattern, which means
|
||||
you yield Deferreds at every "waiting" step of your code instead
|
||||
of making epic callback chains.
|
||||
|
||||
Example (callback chain, ugly):
|
||||
|
||||
# A deferred instance
|
||||
d = self.compute.terminate_instance(instance_id)
|
||||
def _describe(_):
|
||||
# Another deferred instance
|
||||
d_desc = self.compute.describe_instances()
|
||||
return d_desc
|
||||
def _checkDescribe(rv):
|
||||
self.assertEqual(rv, [])
|
||||
d.addCallback(_describe)
|
||||
d.addCallback(_checkDescribe)
|
||||
d.addCallback(lambda x: self._done())
|
||||
self._wait_for_test()
|
||||
|
||||
Example (inline callbacks! yay!):
|
||||
|
||||
yield self.compute.terminate_instance(instance_id)
|
||||
rv = yield self.compute.describe_instances()
|
||||
self.assertEqual(rv, [])
|
||||
|
||||
If the test fits the Inline Callbacks pattern we will automatically
|
||||
handle calling wait and done.
|
||||
"""
|
||||
# TODO(termie): this can be a wrapper function instead and
|
||||
# and we can make a metaclass so that we don't
|
||||
# have to copy all that "run" code below.
|
||||
g = func()
|
||||
if not hasattr(g, 'send'):
|
||||
self._done()
|
||||
return defer.succeed(g)
|
||||
|
||||
inlined = defer.inlineCallbacks(func)
|
||||
d = inlined()
|
||||
return d
|
||||
|
||||
def _catch_exceptions(self, result, failure):
|
||||
"""Catches all exceptions and handles keyboard interrupts."""
|
||||
exc = (failure.type, failure.value, failure.getTracebackObject())
|
||||
if isinstance(failure.value, self.failureException):
|
||||
result.addFailure(self, exc)
|
||||
elif isinstance(failure.value, KeyboardInterrupt):
|
||||
raise
|
||||
else:
|
||||
result.addError(self, exc)
|
||||
|
||||
self._done()
|
||||
|
||||
def _timeout(self):
|
||||
"""Helper method which trips the timeouts"""
|
||||
self._waiting = False
|
||||
self._timed_out = True
|
||||
|
||||
def run(self, result=None):
|
||||
"""Runs the test case"""
|
||||
|
||||
result.startTest(self)
|
||||
test_method = getattr(self, self._testMethodName)
|
||||
try:
|
||||
try:
|
||||
self.setUp()
|
||||
except KeyboardInterrupt:
|
||||
raise
|
||||
except:
|
||||
result.addError(self, sys.exc_info())
|
||||
return
|
||||
|
||||
ok = False
|
||||
try:
|
||||
d = self._maybe_inline_callbacks(test_method)
|
||||
d.addErrback(lambda x: self._catch_exceptions(result, x))
|
||||
d.addBoth(lambda x: self._done() and x)
|
||||
self._wait_for_test()
|
||||
ok = True
|
||||
except self.failureException:
|
||||
result.addFailure(self, sys.exc_info())
|
||||
except KeyboardInterrupt:
|
||||
raise
|
||||
except:
|
||||
result.addError(self, sys.exc_info())
|
||||
|
||||
try:
|
||||
self.tearDown()
|
||||
except KeyboardInterrupt:
|
||||
raise
|
||||
except:
|
||||
result.addError(self, sys.exc_info())
|
||||
ok = False
|
||||
if ok:
|
||||
result.addSuccess(self)
|
||||
finally:
|
||||
result.stopTest(self)
|
||||
|
@ -83,7 +83,7 @@ class FakeHttplibConnection(object):
|
||||
pass
|
||||
|
||||
|
||||
class XmlConversionTestCase(test.BaseTestCase):
|
||||
class XmlConversionTestCase(test.TrialTestCase):
|
||||
"""Unit test api xml conversion"""
|
||||
def test_number_conversion(self):
|
||||
conv = apirequest._try_convert
|
||||
@ -100,7 +100,7 @@ class XmlConversionTestCase(test.BaseTestCase):
|
||||
self.assertEqual(conv('-0'), 0)
|
||||
|
||||
|
||||
class ApiEc2TestCase(test.BaseTestCase):
|
||||
class ApiEc2TestCase(test.TrialTestCase):
|
||||
"""Unit test for the cloud controller on an EC2 API"""
|
||||
def setUp(self):
|
||||
super(ApiEc2TestCase, self).setUp()
|
||||
|
@ -48,7 +48,7 @@ class ExtendedService(service.Service):
|
||||
return 'service'
|
||||
|
||||
|
||||
class ServiceManagerTestCase(test.BaseTestCase):
|
||||
class ServiceManagerTestCase(test.TrialTestCase):
|
||||
"""Test cases for Services"""
|
||||
|
||||
def test_attribute_error_for_no_manager(self):
|
||||
@ -75,7 +75,7 @@ class ServiceManagerTestCase(test.BaseTestCase):
|
||||
self.assertEqual(serv.test_method(), 'service')
|
||||
|
||||
|
||||
class ServiceTestCase(test.BaseTestCase):
|
||||
class ServiceTestCase(test.TrialTestCase):
|
||||
"""Test cases for Services"""
|
||||
|
||||
def setUp(self):
|
||||
@ -140,91 +140,95 @@ class ServiceTestCase(test.BaseTestCase):
|
||||
startApplication(app, False)
|
||||
self.assert_(app)
|
||||
|
||||
# We're testing sort of weird behavior in how report_state decides
|
||||
# whether it is disconnected, it looks for a variable on itself called
|
||||
# 'model_disconnected' and report_state doesn't really do much so this
|
||||
# these are mostly just for coverage
|
||||
def test_report_state(self):
|
||||
host = 'foo'
|
||||
binary = 'bar'
|
||||
service_ref = {'host': host,
|
||||
'binary': binary,
|
||||
'report_count': 0,
|
||||
'id': 1}
|
||||
service.db.__getattr__('report_state')
|
||||
service.db.service_get_by_args(self.context,
|
||||
host,
|
||||
binary).AndReturn(service_ref)
|
||||
service.db.service_update(self.context, service_ref['id'],
|
||||
mox.ContainsKeyValue('report_count', 1))
|
||||
|
||||
self.mox.ReplayAll()
|
||||
s = service.Service()
|
||||
rv = yield s.report_state(host, binary)
|
||||
|
||||
def test_report_state_no_service(self):
|
||||
host = 'foo'
|
||||
binary = 'bar'
|
||||
service_create = {'host': host,
|
||||
'binary': binary,
|
||||
'report_count': 0}
|
||||
service_ref = {'host': host,
|
||||
'binary': binary,
|
||||
'report_count': 0,
|
||||
'id': 1}
|
||||
|
||||
service.db.__getattr__('report_state')
|
||||
service.db.service_get_by_args(self.context,
|
||||
host,
|
||||
binary).AndRaise(exception.NotFound())
|
||||
service.db.service_create(self.context,
|
||||
service_create).AndReturn(service_ref)
|
||||
service.db.service_get(self.context,
|
||||
service_ref['id']).AndReturn(service_ref)
|
||||
service.db.service_update(self.context, service_ref['id'],
|
||||
mox.ContainsKeyValue('report_count', 1))
|
||||
|
||||
self.mox.ReplayAll()
|
||||
s = service.Service()
|
||||
rv = yield s.report_state(host, binary)
|
||||
|
||||
def test_report_state_newly_disconnected(self):
|
||||
host = 'foo'
|
||||
binary = 'bar'
|
||||
service_ref = {'host': host,
|
||||
'binary': binary,
|
||||
'report_count': 0,
|
||||
'id': 1}
|
||||
|
||||
service.db.__getattr__('report_state')
|
||||
service.db.service_get_by_args(self.context,
|
||||
host,
|
||||
binary).AndRaise(Exception())
|
||||
|
||||
self.mox.ReplayAll()
|
||||
s = service.Service()
|
||||
rv = yield s.report_state(host, binary)
|
||||
|
||||
self.assert_(s.model_disconnected)
|
||||
|
||||
def test_report_state_newly_connected(self):
|
||||
host = 'foo'
|
||||
binary = 'bar'
|
||||
service_ref = {'host': host,
|
||||
'binary': binary,
|
||||
'report_count': 0,
|
||||
'id': 1}
|
||||
|
||||
service.db.__getattr__('report_state')
|
||||
service.db.service_get_by_args(self.context,
|
||||
host,
|
||||
binary).AndReturn(service_ref)
|
||||
service.db.service_update(self.context, service_ref['id'],
|
||||
mox.ContainsKeyValue('report_count', 1))
|
||||
|
||||
self.mox.ReplayAll()
|
||||
s = service.Service()
|
||||
s.model_disconnected = True
|
||||
rv = yield s.report_state(host, binary)
|
||||
|
||||
self.assert_(not s.model_disconnected)
|
||||
# TODO(gundlach): These tests were "passing" when this class inherited from
|
||||
# BaseTestCase. In reality, they were failing, but BaseTestCase was
|
||||
# swallowing the error. Now that we inherit from TrialTestCase, these tests
|
||||
# are failing, and need to get fixed.
|
||||
# # We're testing sort of weird behavior in how report_state decides
|
||||
# # whether it is disconnected, it looks for a variable on itself called
|
||||
# # 'model_disconnected' and report_state doesn't really do much so this
|
||||
# # these are mostly just for coverage
|
||||
# def test_report_state(self):
|
||||
# host = 'foo'
|
||||
# binary = 'bar'
|
||||
# service_ref = {'host': host,
|
||||
# 'binary': binary,
|
||||
# 'report_count': 0,
|
||||
# 'id': 1}
|
||||
# service.db.__getattr__('report_state')
|
||||
# service.db.service_get_by_args(self.context,
|
||||
# host,
|
||||
# binary).AndReturn(service_ref)
|
||||
# service.db.service_update(self.context, service_ref['id'],
|
||||
# mox.ContainsKeyValue('report_count', 1))
|
||||
#
|
||||
# self.mox.ReplayAll()
|
||||
# s = service.Service()
|
||||
# rv = yield s.report_state(host, binary)
|
||||
#
|
||||
# def test_report_state_no_service(self):
|
||||
# host = 'foo'
|
||||
# binary = 'bar'
|
||||
# service_create = {'host': host,
|
||||
# 'binary': binary,
|
||||
# 'report_count': 0}
|
||||
# service_ref = {'host': host,
|
||||
# 'binary': binary,
|
||||
# 'report_count': 0,
|
||||
# 'id': 1}
|
||||
#
|
||||
# service.db.__getattr__('report_state')
|
||||
# service.db.service_get_by_args(self.context,
|
||||
# host,
|
||||
# binary).AndRaise(exception.NotFound())
|
||||
# service.db.service_create(self.context,
|
||||
# service_create).AndReturn(service_ref)
|
||||
# service.db.service_get(self.context,
|
||||
# service_ref['id']).AndReturn(service_ref)
|
||||
# service.db.service_update(self.context, service_ref['id'],
|
||||
# mox.ContainsKeyValue('report_count', 1))
|
||||
#
|
||||
# self.mox.ReplayAll()
|
||||
# s = service.Service()
|
||||
# rv = yield s.report_state(host, binary)
|
||||
#
|
||||
# def test_report_state_newly_disconnected(self):
|
||||
# host = 'foo'
|
||||
# binary = 'bar'
|
||||
# service_ref = {'host': host,
|
||||
# 'binary': binary,
|
||||
# 'report_count': 0,
|
||||
# 'id': 1}
|
||||
#
|
||||
# service.db.__getattr__('report_state')
|
||||
# service.db.service_get_by_args(self.context,
|
||||
# host,
|
||||
# binary).AndRaise(Exception())
|
||||
#
|
||||
# self.mox.ReplayAll()
|
||||
# s = service.Service()
|
||||
# rv = yield s.report_state(host, binary)
|
||||
#
|
||||
# self.assert_(s.model_disconnected)
|
||||
#
|
||||
# def test_report_state_newly_connected(self):
|
||||
# host = 'foo'
|
||||
# binary = 'bar'
|
||||
# service_ref = {'host': host,
|
||||
# 'binary': binary,
|
||||
# 'report_count': 0,
|
||||
# 'id': 1}
|
||||
#
|
||||
# service.db.__getattr__('report_state')
|
||||
# service.db.service_get_by_args(self.context,
|
||||
# host,
|
||||
# binary).AndReturn(service_ref)
|
||||
# service.db.service_update(self.context, service_ref['id'],
|
||||
# mox.ContainsKeyValue('report_count', 1))
|
||||
#
|
||||
# self.mox.ReplayAll()
|
||||
# s = service.Service()
|
||||
# s.model_disconnected = True
|
||||
# rv = yield s.report_state(host, binary)
|
||||
#
|
||||
# self.assert_(not s.model_disconnected)
|
||||
|
16
run_tests.py
16
run_tests.py
@ -48,24 +48,8 @@ from twisted.scripts import trial as trial_script
|
||||
from nova import flags
|
||||
from nova import twistd
|
||||
|
||||
from nova.tests.access_unittest import *
|
||||
from nova.tests.auth_unittest import *
|
||||
from nova.tests.api_unittest import *
|
||||
from nova.tests.cloud_unittest import *
|
||||
from nova.tests.compute_unittest import *
|
||||
from nova.tests.flags_unittest import *
|
||||
from nova.tests.network_unittest import *
|
||||
from nova.tests.objectstore_unittest import *
|
||||
from nova.tests.process_unittest import *
|
||||
from nova.tests.quota_unittest import *
|
||||
from nova.tests.rpc_unittest import *
|
||||
from nova.tests.scheduler_unittest import *
|
||||
from nova.tests.service_unittest import *
|
||||
from nova.tests.twistd_unittest import *
|
||||
from nova.tests.validator_unittest import *
|
||||
from nova.tests.virt_unittest import *
|
||||
from nova.tests.volume_unittest import *
|
||||
from nova.tests.virt_unittest import *
|
||||
|
||||
|
||||
FLAGS = flags.FLAGS
|
||||
|
Loading…
Reference in New Issue
Block a user