diff --git a/neutron/tests/base.py b/neutron/tests/base.py index 89e3f81a285..5f46d797be0 100644 --- a/neutron/tests/base.py +++ b/neutron/tests/base.py @@ -37,6 +37,7 @@ from oslo_utils import fileutils from oslo_utils import strutils from oslotest import base import six +from sqlalchemy import exc as sqlalchemy_exc import testtools from neutron._i18n import _ @@ -98,6 +99,28 @@ def sanitize_log_path(path): return path +def skip_if_timeout(reason): + def decor(f): + @functools.wraps(f) + def inner(self, *args, **kwargs): + try: + return f(self, *args, **kwargs) + except fixtures.TimeoutException: + msg = ("Timeout raised for test %s, skipping it " + "because of: %s") % (self.id(), reason) + raise self.skipTest(msg) + except sqlalchemy_exc.InterfaceError: + # In case of db tests very often TimeoutException is reason of + # some sqlalchemy InterfaceError exception and that is final + # raised exception which needs to be handled + msg = ("DB connection broken in test %s. It is very likely " + "that this happend because of test timeout. " + "Skipping test because of: %s") % (self.id(), reason) + raise self.skipTest(msg) + return inner + return decor + + def set_timeout(timeout): """Timeout decorator for test methods. diff --git a/neutron/tests/functional/db/test_migrations.py b/neutron/tests/functional/db/test_migrations.py index 2e4fd50630a..ce89607c8b4 100644 --- a/neutron/tests/functional/db/test_migrations.py +++ b/neutron/tests/functional/db/test_migrations.py @@ -350,6 +350,7 @@ class TestModelsMigrationsMysql(testlib_api.MySQLTestCaseMixin, _TestModelsMigrations, testlib_api.SqlTestCaseLight): + @test_base.skip_if_timeout("bug 1687027") def test_check_mysql_engine(self): engine = self.get_engine() cfg.CONF.set_override('connection', engine.url, group='database') @@ -367,6 +368,32 @@ class TestModelsMigrationsMysql(testlib_api.MySQLTestCaseMixin, and table != 'alembic_version'] self.assertEqual(0, len(res), "%s non InnoDB tables created" % res) + @test_base.skip_if_timeout("bug 1687027") + def test_upgrade_expand_branch(self): + super(TestModelsMigrationsMysql, self).test_upgrade_expand_branch() + + @test_base.skip_if_timeout("bug 1687027") + def test_upgrade_contract_branch(self): + super(TestModelsMigrationsMysql, self).test_upgrade_contract_branch() + + @test_base.skip_if_timeout("bug 1687027") + def test_branches(self): + super(TestModelsMigrationsMysql, self).test_branches() + + @test_base.skip_if_timeout("bug 1687027") + def test_has_offline_migrations_pending_contract_scripts(self): + super(TestModelsMigrationsMysql, + self).test_has_offline_migrations_pending_contract_scripts() + + @test_base.skip_if_timeout("bug 1687027") + def test_has_offline_migrations_all_heads_upgraded(self): + super(TestModelsMigrationsMysql, + self).test_has_offline_migrations_all_heads_upgraded() + + @test_base.skip_if_timeout("bug 1687027") + def test_models_sync(self): + super(TestModelsMigrationsMysql, self).test_models_sync() + class TestModelsMigrationsPsql(testlib_api.PostgreSQLTestCaseMixin, _TestModelsMigrations, @@ -574,6 +601,7 @@ class TestWalkMigrationsMysql(testlib_api.MySQLTestCaseMixin, # on slow nodes than 'psycopg2' and because of that this increased # timeout is required only when for testing with 'mysql' backend. @test_base.set_timeout(600) + @test_base.skip_if_timeout("bug 1687027") def test_walk_versions(self): super(TestWalkMigrationsMysql, self).test_walk_versions()