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:
Andrew Laski 2015-03-16 13:17:09 -04:00
parent 544039653e
commit fbb23bb785
3 changed files with 74 additions and 8 deletions

View File

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

View File

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

View File

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