First pass at converting run_tests.py to nosetests. The network and objctstore tests don't yet work. Also, we need to manually remove the sqlite file between runs.
This commit is contained in:
@@ -1,54 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
|
|
||||||
import boto
|
|
||||||
from boto.ec2.regioninfo import RegionInfo
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
|
|
||||||
ACCESS_KEY = 'fake'
|
|
||||||
SECRET_KEY = 'fake'
|
|
||||||
CLC_IP = '127.0.0.1'
|
|
||||||
CLC_PORT = 8773
|
|
||||||
REGION = 'test'
|
|
||||||
|
|
||||||
|
|
||||||
def get_connection():
|
|
||||||
return boto.connect_ec2(
|
|
||||||
aws_access_key_id=ACCESS_KEY,
|
|
||||||
aws_secret_access_key=SECRET_KEY,
|
|
||||||
is_secure=False,
|
|
||||||
region=RegionInfo(None, REGION, CLC_IP),
|
|
||||||
port=CLC_PORT,
|
|
||||||
path='/services/Cloud',
|
|
||||||
debug=99)
|
|
||||||
|
|
||||||
|
|
||||||
class APIIntegrationTests(unittest.TestCase):
|
|
||||||
def test_001_get_all_images(self):
|
|
||||||
conn = get_connection()
|
|
||||||
res = conn.get_all_images()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
unittest.main()
|
|
||||||
|
|
||||||
#print conn.get_all_key_pairs()
|
|
||||||
#print conn.create_key_pair
|
|
||||||
#print conn.create_security_group('name', 'description')
|
|
@@ -1,153 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from nova import context
|
|
||||||
from nova import db
|
|
||||||
from nova import exception
|
|
||||||
from nova import flags
|
|
||||||
from nova import quota
|
|
||||||
from nova import test
|
|
||||||
from nova import utils
|
|
||||||
from nova.auth import manager
|
|
||||||
from nova.api.ec2 import cloud
|
|
||||||
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
|
|
||||||
|
|
||||||
class QuotaTestCase(test.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
logging.getLogger().setLevel(logging.DEBUG)
|
|
||||||
super(QuotaTestCase, self).setUp()
|
|
||||||
self.flags(connection_type='fake',
|
|
||||||
quota_instances=2,
|
|
||||||
quota_cores=4,
|
|
||||||
quota_volumes=2,
|
|
||||||
quota_gigabytes=20,
|
|
||||||
quota_floating_ips=1)
|
|
||||||
|
|
||||||
self.cloud = cloud.CloudController()
|
|
||||||
self.manager = manager.AuthManager()
|
|
||||||
self.user = self.manager.create_user('admin', 'admin', 'admin', True)
|
|
||||||
self.project = self.manager.create_project('admin', 'admin', 'admin')
|
|
||||||
self.network = utils.import_object(FLAGS.network_manager)
|
|
||||||
self.context = context.RequestContext(project=self.project,
|
|
||||||
user=self.user)
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
manager.AuthManager().delete_project(self.project)
|
|
||||||
manager.AuthManager().delete_user(self.user)
|
|
||||||
super(QuotaTestCase, self).tearDown()
|
|
||||||
|
|
||||||
def _create_instance(self, cores=2):
|
|
||||||
"""Create a test instance"""
|
|
||||||
inst = {}
|
|
||||||
inst['image_id'] = 'ami-test'
|
|
||||||
inst['reservation_id'] = 'r-fakeres'
|
|
||||||
inst['user_id'] = self.user.id
|
|
||||||
inst['project_id'] = self.project.id
|
|
||||||
inst['instance_type'] = 'm1.large'
|
|
||||||
inst['vcpus'] = cores
|
|
||||||
inst['mac_address'] = utils.generate_mac()
|
|
||||||
return db.instance_create(self.context, inst)['id']
|
|
||||||
|
|
||||||
def _create_volume(self, size=10):
|
|
||||||
"""Create a test volume"""
|
|
||||||
vol = {}
|
|
||||||
vol['user_id'] = self.user.id
|
|
||||||
vol['project_id'] = self.project.id
|
|
||||||
vol['size'] = size
|
|
||||||
return db.volume_create(self.context, vol)['id']
|
|
||||||
|
|
||||||
def test_quota_overrides(self):
|
|
||||||
"""Make sure overriding a projects quotas works"""
|
|
||||||
num_instances = quota.allowed_instances(self.context, 100, 'm1.small')
|
|
||||||
self.assertEqual(num_instances, 2)
|
|
||||||
db.quota_create(self.context, {'project_id': self.project.id,
|
|
||||||
'instances': 10})
|
|
||||||
num_instances = quota.allowed_instances(self.context, 100, 'm1.small')
|
|
||||||
self.assertEqual(num_instances, 4)
|
|
||||||
db.quota_update(self.context, self.project.id, {'cores': 100})
|
|
||||||
num_instances = quota.allowed_instances(self.context, 100, 'm1.small')
|
|
||||||
self.assertEqual(num_instances, 10)
|
|
||||||
db.quota_destroy(self.context, self.project.id)
|
|
||||||
|
|
||||||
def test_too_many_instances(self):
|
|
||||||
instance_ids = []
|
|
||||||
for i in range(FLAGS.quota_instances):
|
|
||||||
instance_id = self._create_instance()
|
|
||||||
instance_ids.append(instance_id)
|
|
||||||
self.assertRaises(quota.QuotaError, self.cloud.run_instances,
|
|
||||||
self.context,
|
|
||||||
min_count=1,
|
|
||||||
max_count=1,
|
|
||||||
instance_type='m1.small',
|
|
||||||
image_id='fake')
|
|
||||||
for instance_id in instance_ids:
|
|
||||||
db.instance_destroy(self.context, instance_id)
|
|
||||||
|
|
||||||
def test_too_many_cores(self):
|
|
||||||
instance_ids = []
|
|
||||||
instance_id = self._create_instance(cores=4)
|
|
||||||
instance_ids.append(instance_id)
|
|
||||||
self.assertRaises(quota.QuotaError, self.cloud.run_instances,
|
|
||||||
self.context,
|
|
||||||
min_count=1,
|
|
||||||
max_count=1,
|
|
||||||
instance_type='m1.small',
|
|
||||||
image_id='fake')
|
|
||||||
for instance_id in instance_ids:
|
|
||||||
db.instance_destroy(self.context, instance_id)
|
|
||||||
|
|
||||||
def test_too_many_volumes(self):
|
|
||||||
volume_ids = []
|
|
||||||
for i in range(FLAGS.quota_volumes):
|
|
||||||
volume_id = self._create_volume()
|
|
||||||
volume_ids.append(volume_id)
|
|
||||||
self.assertRaises(quota.QuotaError, self.cloud.create_volume,
|
|
||||||
self.context,
|
|
||||||
size=10)
|
|
||||||
for volume_id in volume_ids:
|
|
||||||
db.volume_destroy(self.context, volume_id)
|
|
||||||
|
|
||||||
def test_too_many_gigabytes(self):
|
|
||||||
volume_ids = []
|
|
||||||
volume_id = self._create_volume(size=20)
|
|
||||||
volume_ids.append(volume_id)
|
|
||||||
self.assertRaises(quota.QuotaError,
|
|
||||||
self.cloud.create_volume,
|
|
||||||
self.context,
|
|
||||||
size=10)
|
|
||||||
for volume_id in volume_ids:
|
|
||||||
db.volume_destroy(self.context, volume_id)
|
|
||||||
|
|
||||||
def test_too_many_addresses(self):
|
|
||||||
address = '192.168.0.100'
|
|
||||||
db.floating_ip_create(context.get_admin_context(),
|
|
||||||
{'address': address, 'host': FLAGS.host})
|
|
||||||
float_addr = self.network.allocate_floating_ip(self.context,
|
|
||||||
self.project.id)
|
|
||||||
# NOTE(vish): This assert never fails. When cloud attempts to
|
|
||||||
# make an rpc.call, the test just finishes with OK. It
|
|
||||||
# appears to be something in the magic inline callbacks
|
|
||||||
# that is breaking.
|
|
||||||
self.assertRaises(quota.QuotaError, self.cloud.allocate_address,
|
|
||||||
self.context)
|
|
||||||
db.floating_ip_destroy(context.get_admin_context(), address)
|
|
@@ -1,227 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
"""
|
|
||||||
Unit Tests for remote procedure calls using queue
|
|
||||||
"""
|
|
||||||
|
|
||||||
import mox
|
|
||||||
|
|
||||||
from nova import exception
|
|
||||||
from nova import flags
|
|
||||||
from nova import rpc
|
|
||||||
from nova import test
|
|
||||||
from nova import service
|
|
||||||
from nova import manager
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
flags.DEFINE_string("fake_manager", "nova.tests.service_unittest.FakeManager",
|
|
||||||
"Manager for testing")
|
|
||||||
|
|
||||||
|
|
||||||
class FakeManager(manager.Manager):
|
|
||||||
"""Fake manager for tests"""
|
|
||||||
def test_method(self):
|
|
||||||
return 'manager'
|
|
||||||
|
|
||||||
|
|
||||||
class ExtendedService(service.Service):
|
|
||||||
def test_method(self):
|
|
||||||
return 'service'
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceManagerTestCase(test.TestCase):
|
|
||||||
"""Test cases for Services"""
|
|
||||||
|
|
||||||
def test_attribute_error_for_no_manager(self):
|
|
||||||
serv = service.Service('test',
|
|
||||||
'test',
|
|
||||||
'test',
|
|
||||||
'nova.tests.service_unittest.FakeManager')
|
|
||||||
self.assertRaises(AttributeError, getattr, serv, 'test_method')
|
|
||||||
|
|
||||||
def test_message_gets_to_manager(self):
|
|
||||||
serv = service.Service('test',
|
|
||||||
'test',
|
|
||||||
'test',
|
|
||||||
'nova.tests.service_unittest.FakeManager')
|
|
||||||
serv.start()
|
|
||||||
self.assertEqual(serv.test_method(), 'manager')
|
|
||||||
|
|
||||||
def test_override_manager_method(self):
|
|
||||||
serv = ExtendedService('test',
|
|
||||||
'test',
|
|
||||||
'test',
|
|
||||||
'nova.tests.service_unittest.FakeManager')
|
|
||||||
serv.start()
|
|
||||||
self.assertEqual(serv.test_method(), 'service')
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceTestCase(test.TestCase):
|
|
||||||
"""Test cases for Services"""
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(ServiceTestCase, self).setUp()
|
|
||||||
self.mox.StubOutWithMock(service, 'db')
|
|
||||||
|
|
||||||
def test_create(self):
|
|
||||||
host = 'foo'
|
|
||||||
binary = 'nova-fake'
|
|
||||||
topic = 'fake'
|
|
||||||
|
|
||||||
# NOTE(vish): Create was moved out of mox replay to make sure that
|
|
||||||
# the looping calls are created in StartService.
|
|
||||||
app = service.Service.create(host=host, binary=binary)
|
|
||||||
|
|
||||||
self.mox.StubOutWithMock(rpc,
|
|
||||||
'AdapterConsumer',
|
|
||||||
use_mock_anything=True)
|
|
||||||
rpc.AdapterConsumer(connection=mox.IgnoreArg(),
|
|
||||||
topic=topic,
|
|
||||||
proxy=mox.IsA(service.Service)).AndReturn(
|
|
||||||
rpc.AdapterConsumer)
|
|
||||||
|
|
||||||
rpc.AdapterConsumer(connection=mox.IgnoreArg(),
|
|
||||||
topic='%s.%s' % (topic, host),
|
|
||||||
proxy=mox.IsA(service.Service)).AndReturn(
|
|
||||||
rpc.AdapterConsumer)
|
|
||||||
|
|
||||||
rpc.AdapterConsumer.attach_to_eventlet()
|
|
||||||
rpc.AdapterConsumer.attach_to_eventlet()
|
|
||||||
|
|
||||||
service_create = {'host': host,
|
|
||||||
'binary': binary,
|
|
||||||
'topic': topic,
|
|
||||||
'report_count': 0}
|
|
||||||
service_ref = {'host': host,
|
|
||||||
'binary': binary,
|
|
||||||
'report_count': 0,
|
|
||||||
'id': 1}
|
|
||||||
|
|
||||||
service.db.service_get_by_args(mox.IgnoreArg(),
|
|
||||||
host,
|
|
||||||
binary).AndRaise(exception.NotFound())
|
|
||||||
service.db.service_create(mox.IgnoreArg(),
|
|
||||||
service_create).AndReturn(service_ref)
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
|
|
||||||
app.start()
|
|
||||||
app.stop()
|
|
||||||
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_no_service(self):
|
|
||||||
host = 'foo'
|
|
||||||
binary = 'bar'
|
|
||||||
topic = 'test'
|
|
||||||
service_create = {'host': host,
|
|
||||||
'binary': binary,
|
|
||||||
'topic': topic,
|
|
||||||
'report_count': 0}
|
|
||||||
service_ref = {'host': host,
|
|
||||||
'binary': binary,
|
|
||||||
'topic': topic,
|
|
||||||
'report_count': 0,
|
|
||||||
'id': 1}
|
|
||||||
|
|
||||||
service.db.service_get_by_args(mox.IgnoreArg(),
|
|
||||||
host,
|
|
||||||
binary).AndRaise(exception.NotFound())
|
|
||||||
service.db.service_create(mox.IgnoreArg(),
|
|
||||||
service_create).AndReturn(service_ref)
|
|
||||||
service.db.service_get(mox.IgnoreArg(),
|
|
||||||
service_ref['id']).AndReturn(service_ref)
|
|
||||||
service.db.service_update(mox.IgnoreArg(), service_ref['id'],
|
|
||||||
mox.ContainsKeyValue('report_count', 1))
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
serv = service.Service(host,
|
|
||||||
binary,
|
|
||||||
topic,
|
|
||||||
'nova.tests.service_unittest.FakeManager')
|
|
||||||
serv.start()
|
|
||||||
serv.report_state()
|
|
||||||
|
|
||||||
def test_report_state_newly_disconnected(self):
|
|
||||||
host = 'foo'
|
|
||||||
binary = 'bar'
|
|
||||||
topic = 'test'
|
|
||||||
service_create = {'host': host,
|
|
||||||
'binary': binary,
|
|
||||||
'topic': topic,
|
|
||||||
'report_count': 0}
|
|
||||||
service_ref = {'host': host,
|
|
||||||
'binary': binary,
|
|
||||||
'topic': topic,
|
|
||||||
'report_count': 0,
|
|
||||||
'id': 1}
|
|
||||||
|
|
||||||
service.db.service_get_by_args(mox.IgnoreArg(),
|
|
||||||
host,
|
|
||||||
binary).AndRaise(exception.NotFound())
|
|
||||||
service.db.service_create(mox.IgnoreArg(),
|
|
||||||
service_create).AndReturn(service_ref)
|
|
||||||
service.db.service_get(mox.IgnoreArg(),
|
|
||||||
mox.IgnoreArg()).AndRaise(Exception())
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
serv = service.Service(host,
|
|
||||||
binary,
|
|
||||||
topic,
|
|
||||||
'nova.tests.service_unittest.FakeManager')
|
|
||||||
serv.start()
|
|
||||||
serv.report_state()
|
|
||||||
self.assert_(serv.model_disconnected)
|
|
||||||
|
|
||||||
def test_report_state_newly_connected(self):
|
|
||||||
host = 'foo'
|
|
||||||
binary = 'bar'
|
|
||||||
topic = 'test'
|
|
||||||
service_create = {'host': host,
|
|
||||||
'binary': binary,
|
|
||||||
'topic': topic,
|
|
||||||
'report_count': 0}
|
|
||||||
service_ref = {'host': host,
|
|
||||||
'binary': binary,
|
|
||||||
'topic': topic,
|
|
||||||
'report_count': 0,
|
|
||||||
'id': 1}
|
|
||||||
|
|
||||||
service.db.service_get_by_args(mox.IgnoreArg(),
|
|
||||||
host,
|
|
||||||
binary).AndRaise(exception.NotFound())
|
|
||||||
service.db.service_create(mox.IgnoreArg(),
|
|
||||||
service_create).AndReturn(service_ref)
|
|
||||||
service.db.service_get(mox.IgnoreArg(),
|
|
||||||
service_ref['id']).AndReturn(service_ref)
|
|
||||||
service.db.service_update(mox.IgnoreArg(), service_ref['id'],
|
|
||||||
mox.ContainsKeyValue('report_count', 1))
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
serv = service.Service(host,
|
|
||||||
binary,
|
|
||||||
topic,
|
|
||||||
'nova.tests.service_unittest.FakeManager')
|
|
||||||
serv.start()
|
|
||||||
serv.model_disconnected = True
|
|
||||||
serv.report_state()
|
|
||||||
|
|
||||||
self.assert_(not serv.model_disconnected)
|
|
@@ -22,13 +22,13 @@ from nova.utils import parse_mailmap, str_dict_replace
|
|||||||
|
|
||||||
class ProjectTestCase(test.TestCase):
|
class ProjectTestCase(test.TestCase):
|
||||||
def test_authors_up_to_date(self):
|
def test_authors_up_to_date(self):
|
||||||
if os.path.exists('../.bzr'):
|
if os.path.exists('.bzr'):
|
||||||
contributors = set()
|
contributors = set()
|
||||||
|
|
||||||
mailmap = parse_mailmap('../.mailmap')
|
mailmap = parse_mailmap('.mailmap')
|
||||||
|
|
||||||
import bzrlib.workingtree
|
import bzrlib.workingtree
|
||||||
tree = bzrlib.workingtree.WorkingTree.open('..')
|
tree = bzrlib.workingtree.WorkingTree.open('.')
|
||||||
tree.lock_read()
|
tree.lock_read()
|
||||||
try:
|
try:
|
||||||
parents = tree.get_parent_ids()
|
parents = tree.get_parent_ids()
|
||||||
@@ -42,7 +42,7 @@ class ProjectTestCase(test.TestCase):
|
|||||||
email = author.split(' ')[-1]
|
email = author.split(' ')[-1]
|
||||||
contributors.add(str_dict_replace(email, mailmap))
|
contributors.add(str_dict_replace(email, mailmap))
|
||||||
|
|
||||||
authors_file = open('../Authors', 'r').read()
|
authors_file = open('Authors', 'r').read()
|
||||||
|
|
||||||
missing = set()
|
missing = set()
|
||||||
for contributor in contributors:
|
for contributor in contributors:
|
@@ -48,7 +48,7 @@ class SchedulerTestCase(test.TestCase):
|
|||||||
"""Test case for scheduler"""
|
"""Test case for scheduler"""
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(SchedulerTestCase, self).setUp()
|
super(SchedulerTestCase, self).setUp()
|
||||||
self.flags(scheduler_driver='nova.tests.scheduler_unittest.TestDriver')
|
self.flags(scheduler_driver='nova.tests.test_scheduler.TestDriver')
|
||||||
|
|
||||||
def test_fallback(self):
|
def test_fallback(self):
|
||||||
scheduler = manager.SchedulerManager()
|
scheduler = manager.SchedulerManager()
|
125
run_tests.py
125
run_tests.py
@@ -1,125 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
"""
|
|
||||||
This is our basic test running framework based on Twisted's Trial.
|
|
||||||
|
|
||||||
Usage Examples:
|
|
||||||
|
|
||||||
# to run all the tests
|
|
||||||
python run_tests.py
|
|
||||||
|
|
||||||
# to run a specific test suite imported here
|
|
||||||
python run_tests.py NodeConnectionTestCase
|
|
||||||
|
|
||||||
# to run a specific test imported here
|
|
||||||
python run_tests.py NodeConnectionTestCase.test_reboot
|
|
||||||
|
|
||||||
# to run some test suites elsewhere
|
|
||||||
python run_tests.py nova.tests.node_unittest
|
|
||||||
python run_tests.py nova.tests.node_unittest.NodeConnectionTestCase
|
|
||||||
|
|
||||||
Due to our use of multiprocessing it we frequently get some ignorable
|
|
||||||
'Interrupted system call' exceptions after test completion.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
import eventlet
|
|
||||||
eventlet.monkey_patch()
|
|
||||||
|
|
||||||
import __main__
|
|
||||||
import gettext
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
gettext.install('nova', unicode=1)
|
|
||||||
|
|
||||||
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.api_unittest import *
|
|
||||||
from nova.tests.auth_unittest import *
|
|
||||||
from nova.tests.cloud_unittest import *
|
|
||||||
from nova.tests.compute_unittest import *
|
|
||||||
from nova.tests.flags_unittest import *
|
|
||||||
from nova.tests.misc_unittest import *
|
|
||||||
from nova.tests.network_unittest import *
|
|
||||||
#from nova.tests.objectstore_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.virt_unittest import *
|
|
||||||
from nova.tests.volume_unittest import *
|
|
||||||
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
flags.DEFINE_bool('flush_db', True,
|
|
||||||
'Flush the database before running fake tests')
|
|
||||||
flags.DEFINE_string('tests_stderr', 'run_tests.err.log',
|
|
||||||
'Path to where to pipe STDERR during test runs.'
|
|
||||||
' Default = "run_tests.err.log"')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
OptionsClass = twistd.WrapTwistedOptions(trial_script.Options)
|
|
||||||
config = OptionsClass()
|
|
||||||
argv = config.parseOptions()
|
|
||||||
|
|
||||||
FLAGS.verbose = True
|
|
||||||
|
|
||||||
# TODO(termie): these should make a call instead of doing work on import
|
|
||||||
if FLAGS.fake_tests:
|
|
||||||
from nova.tests.fake_flags import *
|
|
||||||
else:
|
|
||||||
from nova.tests.real_flags import *
|
|
||||||
|
|
||||||
# Establish redirect for STDERR
|
|
||||||
sys.stderr.flush()
|
|
||||||
err = open(FLAGS.tests_stderr, 'w+', 0)
|
|
||||||
os.dup2(err.fileno(), sys.stderr.fileno())
|
|
||||||
|
|
||||||
if len(argv) == 1 and len(config['tests']) == 0:
|
|
||||||
# If no tests were specified run the ones imported in this file
|
|
||||||
# NOTE(termie): "tests" is not a flag, just some Trial related stuff
|
|
||||||
config['tests'].update(['__main__'])
|
|
||||||
elif len(config['tests']):
|
|
||||||
# If we specified tests check first whether they are in __main__
|
|
||||||
for arg in config['tests']:
|
|
||||||
key = arg.split('.')[0]
|
|
||||||
if hasattr(__main__, key):
|
|
||||||
config['tests'].remove(arg)
|
|
||||||
config['tests'].add('__main__.%s' % arg)
|
|
||||||
|
|
||||||
trial_script._initialDebugSetup(config)
|
|
||||||
trialRunner = trial_script._makeRunner(config)
|
|
||||||
suite = trial_script._getSuite(config)
|
|
||||||
if config['until-failure']:
|
|
||||||
test_result = trialRunner.runUntilFailure(suite)
|
|
||||||
else:
|
|
||||||
test_result = trialRunner.run(suite)
|
|
||||||
if config.tracer:
|
|
||||||
sys.settrace(None)
|
|
||||||
results = config.tracer.results()
|
|
||||||
results.write_results(show_missing=1, summary=False,
|
|
||||||
coverdir=config.coverdir)
|
|
||||||
sys.exit(not test_result.wasSuccessful())
|
|
Reference in New Issue
Block a user