#!/usr/bin/python import unittest, tempfile, os import common import MySQLdb from autotest_lib.client.common_lib import global_config from autotest_lib.database import database_connection, migrate # Which section of the global config to pull info from. We won't actually use # that DB, we'll use the corresponding test DB (test_). CONFIG_DB = 'AUTOTEST_WEB' NUM_MIGRATIONS = 3 class DummyMigration(object): """\ Dummy migration class that records all migrations done in a class varaible. """ migrations_done = [] def __init__(self, version): self.version = version self.name = '%03d_test' % version @classmethod def get_migrations_done(cls): return cls.migrations_done @classmethod def clear_migrations_done(cls): cls.migrations_done = [] @classmethod def do_migration(cls, version, direction): cls.migrations_done.append((version, direction)) def migrate_up(self, manager): self.do_migration(self.version, 'up') if self.version == 1: manager.create_migrate_table() def migrate_down(self, manager): self.do_migration(self.version, 'down') MIGRATIONS = [DummyMigration(n) for n in xrange(1, NUM_MIGRATIONS + 1)] class TestableMigrationManager(migrate.MigrationManager): def _set_migrations_dir(self, migrations_dir=None): pass def get_migrations(self, minimum_version=None, maximum_version=None): minimum_version = minimum_version or 1 maximum_version = maximum_version or len(MIGRATIONS) return MIGRATIONS[minimum_version-1:maximum_version] class MigrateManagerTest(unittest.TestCase): def setUp(self): self._database = ( database_connection.DatabaseConnection.get_test_database()) self._database.connect() self.manager = TestableMigrationManager(self._database) DummyMigration.clear_migrations_done() def tearDown(self): self._database.disconnect() def test_sync(self): self.manager.do_sync_db() self.assertEquals(self.manager.get_db_version(), NUM_MIGRATIONS) self.assertEquals(DummyMigration.get_migrations_done(), [(1, 'up'), (2, 'up'), (3, 'up')]) DummyMigration.clear_migrations_done() self.manager.do_sync_db(0) self.assertEquals(self.manager.get_db_version(), 0) self.assertEquals(DummyMigration.get_migrations_done(), [(3, 'down'), (2, 'down'), (1, 'down')]) def test_sync_one_by_one(self): for version in xrange(1, NUM_MIGRATIONS + 1): self.manager.do_sync_db(version) self.assertEquals(self.manager.get_db_version(), version) self.assertEquals( DummyMigration.get_migrations_done()[-1], (version, 'up')) for version in xrange(NUM_MIGRATIONS - 1, -1, -1): self.manager.do_sync_db(version) self.assertEquals(self.manager.get_db_version(), version) self.assertEquals( DummyMigration.get_migrations_done()[-1], (version + 1, 'down')) def test_null_sync(self): self.manager.do_sync_db() DummyMigration.clear_migrations_done() self.manager.do_sync_db() self.assertEquals(DummyMigration.get_migrations_done(), []) class DummyMigrationManager(object): def __init__(self): self.calls = [] def execute_script(self, script): self.calls.append(script) class MigrationTest(unittest.TestCase): def setUp(self): self.manager = DummyMigrationManager() def _do_migration(self, migration_module): migration = migrate.Migration('name', 1, migration_module) migration.migrate_up(self.manager) migration.migrate_down(self.manager) self.assertEquals(self.manager.calls, ['foo', 'bar']) def test_migration_with_methods(self): class DummyMigration(object): @staticmethod def migrate_up(manager): manager.execute_script('foo') @staticmethod def migrate_down(manager): manager.execute_script('bar') self._do_migration(DummyMigration) def test_migration_with_strings(self): class DummyMigration(object): UP_SQL = 'foo' DOWN_SQL = 'bar' self._do_migration(DummyMigration) if __name__ == '__main__': unittest.main()