Test fixture for the api database
In order to run fuctional tests against the database we should have a fixture to handle the setup and cleanup. This adapts the current Database fixture to work for either database. It is left out the Nova TestCase test class and should be set up in specific test classes that need it. Change-Id: I98e98cb6dea0008d36397b4e2bf7fcf9ed721721
This commit is contained in:
parent
544039653e
commit
fbb23bb785
|
@ -35,7 +35,7 @@ from nova.tests.functional.api import client
|
|||
_TRUE_VALUES = ('True', 'true', '1', 'yes')
|
||||
|
||||
CONF = cfg.CONF
|
||||
DB_SCHEMA = ""
|
||||
DB_SCHEMA = {'main': "", 'api': ""}
|
||||
|
||||
|
||||
class ServiceFixture(fixtures.Fixture):
|
||||
|
@ -190,25 +190,34 @@ class Timeout(fixtures.Fixture):
|
|||
|
||||
|
||||
class Database(fixtures.Fixture):
|
||||
def __init__(self, database='main'):
|
||||
super(Database, self).__init__()
|
||||
self.database = database
|
||||
if database == 'main':
|
||||
self.get_engine = session.get_engine
|
||||
elif database == 'api':
|
||||
self.get_engine = session.get_api_engine
|
||||
|
||||
def _cache_schema(self):
|
||||
global DB_SCHEMA
|
||||
if not DB_SCHEMA:
|
||||
engine = session.get_engine()
|
||||
if not DB_SCHEMA[self.database]:
|
||||
engine = self.get_engine()
|
||||
conn = engine.connect()
|
||||
migration.db_sync()
|
||||
DB_SCHEMA = "".join(line for line in conn.connection.iterdump())
|
||||
migration.db_sync(database=self.database)
|
||||
DB_SCHEMA[self.database] = "".join(line for line
|
||||
in conn.connection.iterdump())
|
||||
engine.dispose()
|
||||
|
||||
def cleanup(self):
|
||||
engine = session.get_engine()
|
||||
engine = self.get_engine()
|
||||
engine.dispose()
|
||||
|
||||
def reset(self):
|
||||
self._cache_schema()
|
||||
engine = session.get_engine()
|
||||
engine = self.get_engine()
|
||||
engine.dispose()
|
||||
conn = engine.connect()
|
||||
conn.connection.executescript(DB_SCHEMA)
|
||||
conn.connection.executescript(DB_SCHEMA[self.database])
|
||||
|
||||
def setUp(self):
|
||||
super(Database, self).setUp()
|
||||
|
|
|
@ -58,7 +58,10 @@ class ConfFixture(config_fixture.Config):
|
|||
self.conf.set_default('auth_strategy', 'noauth2')
|
||||
config.parse_args([], default_config_files=[])
|
||||
self.conf.set_default('connection', "sqlite://", group='database')
|
||||
self.conf.set_default('connection', "sqlite://", group='api_database')
|
||||
self.conf.set_default('sqlite_synchronous', False, group='database')
|
||||
self.conf.set_default('sqlite_synchronous', False,
|
||||
group='api_database')
|
||||
self.conf.set_default('fatal_exception_format_errors', True)
|
||||
self.conf.set_default('enabled', True, 'osapi_v3')
|
||||
self.conf.set_default('force_dhcp_release', False)
|
||||
|
|
|
@ -19,6 +19,7 @@ import sys
|
|||
import fixtures as fx
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import uuidutils
|
||||
import testtools
|
||||
|
||||
from nova.db.sqlalchemy import api as session
|
||||
|
@ -206,6 +207,34 @@ class TestDatabaseFixture(testtools.TestCase):
|
|||
rows = result.fetchall()
|
||||
self.assertEqual(len(rows), 5, "Rows %s" % rows)
|
||||
|
||||
def test_api_fixture_reset(self):
|
||||
# This sets up reasonable db connection strings
|
||||
self.useFixture(conf_fixture.ConfFixture())
|
||||
self.useFixture(fixtures.Database(database='api'))
|
||||
engine = session.get_api_engine()
|
||||
conn = engine.connect()
|
||||
result = conn.execute("select * from cell_mappings")
|
||||
rows = result.fetchall()
|
||||
self.assertEqual(len(rows), 0, "Rows %s" % rows)
|
||||
|
||||
uuid = uuidutils.generate_uuid()
|
||||
conn.execute("insert into cell_mappings (uuid, name) VALUES "
|
||||
"('%s', 'fake-cell')" % (uuid,))
|
||||
result = conn.execute("select * from cell_mappings")
|
||||
rows = result.fetchall()
|
||||
self.assertEqual(len(rows), 1, "Rows %s" % rows)
|
||||
|
||||
# reset by invoking the fixture again
|
||||
#
|
||||
# NOTE(sdague): it's important to reestablish the db
|
||||
# connection because otherwise we have a reference to the old
|
||||
# in mem db.
|
||||
self.useFixture(fixtures.Database(database='api'))
|
||||
conn = engine.connect()
|
||||
result = conn.execute("select * from cell_mappings")
|
||||
rows = result.fetchall()
|
||||
self.assertEqual(len(rows), 0, "Rows %s" % rows)
|
||||
|
||||
def test_fixture_cleanup(self):
|
||||
# because this sets up reasonable db connection strings
|
||||
self.useFixture(conf_fixture.ConfFixture())
|
||||
|
@ -220,3 +249,28 @@ class TestDatabaseFixture(testtools.TestCase):
|
|||
conn = engine.connect()
|
||||
schema = "".join(line for line in conn.connection.iterdump())
|
||||
self.assertEqual(schema, "BEGIN TRANSACTION;COMMIT;")
|
||||
|
||||
def test_api_fixture_cleanup(self):
|
||||
# This sets up reasonable db connection strings
|
||||
self.useFixture(conf_fixture.ConfFixture())
|
||||
fix = fixtures.Database(database='api')
|
||||
self.useFixture(fix)
|
||||
|
||||
# No data inserted by migrations so we need to add a row
|
||||
engine = session.get_api_engine()
|
||||
conn = engine.connect()
|
||||
uuid = uuidutils.generate_uuid()
|
||||
conn.execute("insert into cell_mappings (uuid, name) VALUES "
|
||||
"('%s', 'fake-cell')" % (uuid,))
|
||||
result = conn.execute("select * from cell_mappings")
|
||||
rows = result.fetchall()
|
||||
self.assertEqual(len(rows), 1, "Rows %s" % rows)
|
||||
|
||||
# Manually do the cleanup that addCleanup will do
|
||||
fix.cleanup()
|
||||
|
||||
# Ensure the db contains nothing
|
||||
engine = session.get_api_engine()
|
||||
conn = engine.connect()
|
||||
schema = "".join(line for line in conn.connection.iterdump())
|
||||
self.assertEqual(schema, "BEGIN TRANSACTION;COMMIT;")
|
||||
|
|
Loading…
Reference in New Issue