summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2021-11-09 13:59:03 +0000
committerGerrit Code Review <review@openstack.org>2021-11-09 13:59:03 +0000
commit78d398ad91c7708d2a868ae216284b5bdcdc5ec6 (patch)
tree1f9c68588cea3edf3f786718f1e1d9b678cdb538
parentbae60995e3573d2f11aec102870d569ab72c877b (diff)
parenta7bccff06b871765fb87ee3e9edd9458c7f73701 (diff)
downloadnova-78d398ad91c7708d2a868ae216284b5bdcdc5ec6.tar.gz
Merge "Fix interference in db unit test"
-rw-r--r--nova/tests/fixtures/nova.py12
-rw-r--r--nova/tests/unit/db/api/test_migrations.py11
-rw-r--r--nova/tests/unit/db/main/test_migrations.py11
-rw-r--r--nova/tests/unit/db/test_migration.py14
4 files changed, 30 insertions, 18 deletions
diff --git a/nova/tests/fixtures/nova.py b/nova/tests/fixtures/nova.py
index 0acc3fa151..f7e272e9f2 100644
--- a/nova/tests/fixtures/nova.py
+++ b/nova/tests/fixtures/nova.py
@@ -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
diff --git a/nova/tests/unit/db/api/test_migrations.py b/nova/tests/unit/db/api/test_migrations.py
index 10c0c8feb9..1b14d569db 100644
--- a/nova/tests/unit/db/api/test_migrations.py
+++ b/nova/tests/unit/db/api/test_migrations.py
@@ -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(
diff --git a/nova/tests/unit/db/main/test_migrations.py b/nova/tests/unit/db/main/test_migrations.py
index 478920c248..cb253dfc5b 100644
--- a/nova/tests/unit/db/main/test_migrations.py
+++ b/nova/tests/unit/db/main/test_migrations.py
@@ -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(
diff --git a/nova/tests/unit/db/test_migration.py b/nova/tests/unit/db/test_migration.py
index 7251b174b1..6657bc48e0 100644
--- a/nova/tests/unit/db/test_migration.py
+++ b/nova/tests/unit/db/test_migration.py
@@ -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):