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:
Michael Gundlach 2010-10-26 11:48:20 -04:00
parent 11802b76c0
commit ba6d929320
4 changed files with 96 additions and 264 deletions

View File

@ -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)

View File

@ -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()

View File

@ -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)

View File

@ -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