2013-06-03 17:24:07 +03:00
|
|
|
# Copyright 2010-2011 OpenStack Foundation
|
|
|
|
# Copyright 2012-2013 IBM Corp.
|
|
|
|
# All Rights Reserved.
|
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
|
|
# not use this file except in compliance with the License. You may obtain
|
|
|
|
# a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
# License for the specific language governing permissions and limitations
|
|
|
|
# under the License.
|
|
|
|
|
2013-06-05 12:08:41 +03:00
|
|
|
import mock
|
2014-04-15 13:05:35 +03:00
|
|
|
from oslotest import base as test_base
|
2013-06-03 17:24:07 +03:00
|
|
|
|
2014-04-18 11:33:16 +03:00
|
|
|
from oslo.db.sqlalchemy import test_migrations as migrate
|
2013-06-03 17:24:07 +03:00
|
|
|
|
|
|
|
|
2014-04-15 13:05:35 +03:00
|
|
|
class TestWalkVersions(test_base.BaseTestCase, migrate.WalkVersionsMixin):
|
2013-06-05 12:08:41 +03:00
|
|
|
def setUp(self):
|
|
|
|
super(TestWalkVersions, self).setUp()
|
|
|
|
self.migration_api = mock.MagicMock()
|
|
|
|
self.engine = mock.MagicMock()
|
|
|
|
self.REPOSITORY = mock.MagicMock()
|
|
|
|
self.INIT_VERSION = 4
|
|
|
|
|
|
|
|
def test_migrate_up(self):
|
|
|
|
self.migration_api.db_version.return_value = 141
|
|
|
|
|
|
|
|
self._migrate_up(self.engine, 141)
|
|
|
|
|
|
|
|
self.migration_api.upgrade.assert_called_with(
|
|
|
|
self.engine, self.REPOSITORY, 141)
|
|
|
|
self.migration_api.db_version.assert_called_with(
|
|
|
|
self.engine, self.REPOSITORY)
|
|
|
|
|
|
|
|
def test_migrate_up_with_data(self):
|
|
|
|
test_value = {"a": 1, "b": 2}
|
|
|
|
self.migration_api.db_version.return_value = 141
|
|
|
|
self._pre_upgrade_141 = mock.MagicMock()
|
|
|
|
self._pre_upgrade_141.return_value = test_value
|
|
|
|
self._check_141 = mock.MagicMock()
|
|
|
|
|
|
|
|
self._migrate_up(self.engine, 141, True)
|
|
|
|
|
|
|
|
self._pre_upgrade_141.assert_called_with(self.engine)
|
|
|
|
self._check_141.assert_called_with(self.engine, test_value)
|
|
|
|
|
|
|
|
def test_migrate_down(self):
|
|
|
|
self.migration_api.db_version.return_value = 42
|
|
|
|
|
|
|
|
self.assertTrue(self._migrate_down(self.engine, 42))
|
|
|
|
self.migration_api.db_version.assert_called_with(
|
|
|
|
self.engine, self.REPOSITORY)
|
|
|
|
|
|
|
|
def test_migrate_down_not_implemented(self):
|
|
|
|
self.migration_api.downgrade.side_effect = NotImplementedError
|
|
|
|
self.assertFalse(self._migrate_down(self.engine, 42))
|
|
|
|
|
|
|
|
def test_migrate_down_with_data(self):
|
|
|
|
self._post_downgrade_043 = mock.MagicMock()
|
|
|
|
self.migration_api.db_version.return_value = 42
|
|
|
|
|
|
|
|
self._migrate_down(self.engine, 42, True)
|
|
|
|
|
|
|
|
self._post_downgrade_043.assert_called_with(self.engine)
|
|
|
|
|
2013-08-06 12:09:02 +03:00
|
|
|
@mock.patch.object(migrate.WalkVersionsMixin, '_migrate_up')
|
|
|
|
@mock.patch.object(migrate.WalkVersionsMixin, '_migrate_down')
|
2013-06-05 12:08:41 +03:00
|
|
|
def test_walk_versions_all_default(self, _migrate_up, _migrate_down):
|
|
|
|
self.REPOSITORY.latest = 20
|
|
|
|
self.migration_api.db_version.return_value = self.INIT_VERSION
|
|
|
|
|
|
|
|
self._walk_versions()
|
|
|
|
|
|
|
|
self.migration_api.version_control.assert_called_with(
|
|
|
|
None, self.REPOSITORY, self.INIT_VERSION)
|
|
|
|
self.migration_api.db_version.assert_called_with(
|
|
|
|
None, self.REPOSITORY)
|
|
|
|
|
|
|
|
versions = range(self.INIT_VERSION + 1, self.REPOSITORY.latest + 1)
|
|
|
|
upgraded = [mock.call(None, v, with_data=True) for v in versions]
|
2013-08-16 09:23:32 +08:00
|
|
|
self.assertEqual(self._migrate_up.call_args_list, upgraded)
|
2013-06-05 12:08:41 +03:00
|
|
|
|
|
|
|
downgraded = [mock.call(None, v - 1) for v in reversed(versions)]
|
2013-08-16 09:23:32 +08:00
|
|
|
self.assertEqual(self._migrate_down.call_args_list, downgraded)
|
2013-06-05 12:08:41 +03:00
|
|
|
|
2013-08-06 12:09:02 +03:00
|
|
|
@mock.patch.object(migrate.WalkVersionsMixin, '_migrate_up')
|
|
|
|
@mock.patch.object(migrate.WalkVersionsMixin, '_migrate_down')
|
2013-06-05 12:08:41 +03:00
|
|
|
def test_walk_versions_all_true(self, _migrate_up, _migrate_down):
|
|
|
|
self.REPOSITORY.latest = 20
|
|
|
|
self.migration_api.db_version.return_value = self.INIT_VERSION
|
|
|
|
|
|
|
|
self._walk_versions(self.engine, snake_walk=True, downgrade=True)
|
|
|
|
|
|
|
|
versions = range(self.INIT_VERSION + 1, self.REPOSITORY.latest + 1)
|
|
|
|
upgraded = []
|
|
|
|
for v in versions:
|
|
|
|
upgraded.append(mock.call(self.engine, v, with_data=True))
|
|
|
|
upgraded.append(mock.call(self.engine, v))
|
|
|
|
upgraded.extend(
|
|
|
|
[mock.call(self.engine, v) for v in reversed(versions)]
|
|
|
|
)
|
2013-08-16 09:23:32 +08:00
|
|
|
self.assertEqual(upgraded, self._migrate_up.call_args_list)
|
2013-06-05 12:08:41 +03:00
|
|
|
|
|
|
|
downgraded_1 = [
|
|
|
|
mock.call(self.engine, v - 1, with_data=True) for v in versions
|
|
|
|
]
|
|
|
|
downgraded_2 = []
|
|
|
|
for v in reversed(versions):
|
|
|
|
downgraded_2.append(mock.call(self.engine, v - 1))
|
|
|
|
downgraded_2.append(mock.call(self.engine, v - 1))
|
|
|
|
downgraded = downgraded_1 + downgraded_2
|
2013-08-16 09:23:32 +08:00
|
|
|
self.assertEqual(self._migrate_down.call_args_list, downgraded)
|
2013-06-05 12:08:41 +03:00
|
|
|
|
2013-08-06 12:09:02 +03:00
|
|
|
@mock.patch.object(migrate.WalkVersionsMixin, '_migrate_up')
|
|
|
|
@mock.patch.object(migrate.WalkVersionsMixin, '_migrate_down')
|
2013-06-05 12:08:41 +03:00
|
|
|
def test_walk_versions_true_false(self, _migrate_up, _migrate_down):
|
|
|
|
self.REPOSITORY.latest = 20
|
|
|
|
self.migration_api.db_version.return_value = self.INIT_VERSION
|
|
|
|
|
|
|
|
self._walk_versions(self.engine, snake_walk=True, downgrade=False)
|
|
|
|
|
|
|
|
versions = range(self.INIT_VERSION + 1, self.REPOSITORY.latest + 1)
|
|
|
|
|
|
|
|
upgraded = []
|
|
|
|
for v in versions:
|
|
|
|
upgraded.append(mock.call(self.engine, v, with_data=True))
|
|
|
|
upgraded.append(mock.call(self.engine, v))
|
2013-08-16 09:23:32 +08:00
|
|
|
self.assertEqual(upgraded, self._migrate_up.call_args_list)
|
2013-06-05 12:08:41 +03:00
|
|
|
|
|
|
|
downgraded = [
|
|
|
|
mock.call(self.engine, v - 1, with_data=True) for v in versions
|
|
|
|
]
|
2013-08-16 09:23:32 +08:00
|
|
|
self.assertEqual(self._migrate_down.call_args_list, downgraded)
|
2013-06-05 12:08:41 +03:00
|
|
|
|
2013-08-06 12:09:02 +03:00
|
|
|
@mock.patch.object(migrate.WalkVersionsMixin, '_migrate_up')
|
|
|
|
@mock.patch.object(migrate.WalkVersionsMixin, '_migrate_down')
|
2013-06-05 12:08:41 +03:00
|
|
|
def test_walk_versions_all_false(self, _migrate_up, _migrate_down):
|
|
|
|
self.REPOSITORY.latest = 20
|
|
|
|
self.migration_api.db_version.return_value = self.INIT_VERSION
|
|
|
|
|
|
|
|
self._walk_versions(self.engine, snake_walk=False, downgrade=False)
|
|
|
|
|
|
|
|
versions = range(self.INIT_VERSION + 1, self.REPOSITORY.latest + 1)
|
|
|
|
|
|
|
|
upgraded = [
|
|
|
|
mock.call(self.engine, v, with_data=True) for v in versions
|
|
|
|
]
|
2013-08-16 09:23:32 +08:00
|
|
|
self.assertEqual(upgraded, self._migrate_up.call_args_list)
|