Merge "Fix interference in db unit test"

This commit is contained in:
Zuul
2021-11-09 13:59:03 +00:00
committed by Gerrit Code Review
4 changed files with 30 additions and 18 deletions
+12
View File
@@ -204,6 +204,18 @@ class DatabasePoisonFixture(fixtures.Fixture):
'_create_session',
self._poison_configure))
# NOTE(gibi): not just _create_session indicates a manipulation on the
# DB but actually any operation that actually initializes (starts) a
# transaction factory. If a test does this without using the Database
# fixture then that test i) actually a database test and should declare
# it so ii) actually manipulates a global state without proper cleanup
# and test isolation. This could lead that later tests are failing with
# the error: oslo_db.sqlalchemy.enginefacade.AlreadyStartedError: this
# TransactionFactory is already started
self.useFixture(fixtures.MonkeyPatch(
'oslo_db.sqlalchemy.enginefacade._TransactionFactory._start',
self._poison_configure))
def _poison_configure(self, *a, **k):
# If you encounter this error, you might be tempted to just not
# inherit from NoDBTestCase. Bug #1568414 fixed a few hundred of these
+7 -4
View File
@@ -275,11 +275,14 @@ class NovaMigrationsWalk(
self._migrate_up(connection, revision)
def test_db_version_alembic(self):
migration.db_sync(database='api')
engine = enginefacade.writer.get_engine()
script = alembic_script.ScriptDirectory.from_config(self.config)
head = script.get_current_head()
self.assertEqual(head, migration.db_version(database='api'))
with mock.patch.object(migration, '_get_engine', return_value=engine):
migration.db_sync(database='api')
script = alembic_script.ScriptDirectory.from_config(self.config)
head = script.get_current_head()
self.assertEqual(head, migration.db_version(database='api'))
class TestMigrationsWalkSQLite(
+7 -4
View File
@@ -308,11 +308,14 @@ class NovaMigrationsWalk(
self._migrate_up(connection, revision)
def test_db_version_alembic(self):
migration.db_sync(database='main')
engine = enginefacade.writer.get_engine()
script = alembic_script.ScriptDirectory.from_config(self.config)
head = script.get_current_head()
self.assertEqual(head, migration.db_version(database='main'))
with mock.patch.object(migration, '_get_engine', return_value=engine):
migration.db_sync(database='main')
script = alembic_script.ScriptDirectory.from_config(self.config)
head = script.get_current_head()
self.assertEqual(head, migration.db_version(database='main'))
class TestMigrationsWalkSQLite(
+4 -10
View File
@@ -17,33 +17,27 @@ import os
import urllib
from alembic.runtime import migration as alembic_migration
import fixtures
from migrate import exceptions as migrate_exceptions
from migrate.versioning import api as migrate_api
import mock
from oslo_db.sqlalchemy import enginefacade
from nova.db.api import api as api_db_api
from nova.db.main import api as main_db_api
from nova.db import migration
from nova import exception
from nova import test
from nova.tests import fixtures as nova_fixtures
class TestDBURL(test.NoDBTestCase):
USES_DB_SELF = True
def test_db_sync_with_special_symbols_in_connection_string(self):
qargs = 'read_default_group=data with/a+percent_%-and%20symbols!'
url = f"sqlite:///:memory:?{qargs}"
self.flags(connection=url, group='database')
# since the engine.url is immutable it will never get updated
# once its created so reusing the engine instance would break
# this test.
engine = enginefacade.writer.get_engine()
self.useFixture(
fixtures.MonkeyPatch(
'nova.db.migration._get_engine',
mock.Mock(return_value=engine)))
self.useFixture(nova_fixtures.Database())
alembic_config = migration._find_alembic_conf()
with mock.patch.object(
migration, '_find_alembic_conf', return_value=alembic_config):