Convert all python code to use four-space indents instead of eight-space tabs.
Signed-off-by: John Admanski <[email protected]>
git-svn-id: http://test.kernel.org/svn/autotest/trunk@1658 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/migrate/migrate.py b/migrate/migrate.py
index 8bbcb5f..fbed905 100755
--- a/migrate/migrate.py
+++ b/migrate/migrate.py
@@ -10,267 +10,267 @@
DEFAULT_MIGRATIONS_DIR = 'migrations'
class Migration(object):
- def __init__(self, filename):
- self.version = int(filename[:3])
- self.name = filename[:-3]
- self.module = __import__(self.name, globals(), locals(), [])
- assert hasattr(self.module, 'migrate_up')
- assert hasattr(self.module, 'migrate_down')
+ def __init__(self, filename):
+ self.version = int(filename[:3])
+ self.name = filename[:-3]
+ self.module = __import__(self.name, globals(), locals(), [])
+ assert hasattr(self.module, 'migrate_up')
+ assert hasattr(self.module, 'migrate_down')
- def migrate_up(self, manager):
- self.module.migrate_up(manager)
+ def migrate_up(self, manager):
+ self.module.migrate_up(manager)
- def migrate_down(self, manager):
- self.module.migrate_down(manager)
+ def migrate_down(self, manager):
+ self.module.migrate_down(manager)
class MigrationManager(object):
- connection = None
- cursor = None
- migrations_dir = None
+ connection = None
+ cursor = None
+ migrations_dir = None
- def __init__(self, database, migrations_dir=None):
- self.database = database
- if migrations_dir is None:
- migrations_dir = os.path.abspath(DEFAULT_MIGRATIONS_DIR)
- self.migrations_dir = migrations_dir
- sys.path.append(migrations_dir)
- assert os.path.exists(migrations_dir)
+ def __init__(self, database, migrations_dir=None):
+ self.database = database
+ if migrations_dir is None:
+ migrations_dir = os.path.abspath(DEFAULT_MIGRATIONS_DIR)
+ self.migrations_dir = migrations_dir
+ sys.path.append(migrations_dir)
+ assert os.path.exists(migrations_dir)
- self.db_host = None
- self.db_name = None
- self.username = None
- self.password = None
+ self.db_host = None
+ self.db_name = None
+ self.username = None
+ self.password = None
- def read_db_info(self):
- # grab the config file and parse for info
- c = global_config.global_config
- self.db_host = c.get_config_value(self.database, "host")
- self.db_name = c.get_config_value(self.database, "database")
- self.username = c.get_config_value(self.database, "user")
- self.password = c.get_config_value(self.database, "password")
+ def read_db_info(self):
+ # grab the config file and parse for info
+ c = global_config.global_config
+ self.db_host = c.get_config_value(self.database, "host")
+ self.db_name = c.get_config_value(self.database, "database")
+ self.username = c.get_config_value(self.database, "user")
+ self.password = c.get_config_value(self.database, "password")
- def connect(self, host, db_name, username, password):
- return MySQLdb.connect(host=host, db=db_name, user=username,
- passwd=password)
+ def connect(self, host, db_name, username, password):
+ return MySQLdb.connect(host=host, db=db_name, user=username,
+ passwd=password)
- def open_connection(self):
- self.connection = self.connect(self.db_host, self.db_name,
- self.username, self.password)
- self.connection.autocommit(True)
- self.cursor = self.connection.cursor()
+ def open_connection(self):
+ self.connection = self.connect(self.db_host, self.db_name,
+ self.username, self.password)
+ self.connection.autocommit(True)
+ self.cursor = self.connection.cursor()
- def close_connection(self):
- self.connection.close()
+ def close_connection(self):
+ self.connection.close()
- def execute(self, query, *parameters):
- #print 'SQL:', query % parameters
- return self.cursor.execute(query, parameters)
+ def execute(self, query, *parameters):
+ #print 'SQL:', query % parameters
+ return self.cursor.execute(query, parameters)
- def execute_script(self, script):
- sql_statements = [statement.strip() for statement
- in script.split(';')]
- for statement in sql_statements:
- if statement:
- self.execute(statement)
+ def execute_script(self, script):
+ sql_statements = [statement.strip() for statement
+ in script.split(';')]
+ for statement in sql_statements:
+ if statement:
+ self.execute(statement)
- def check_migrate_table_exists(self):
- try:
- self.execute("SELECT * FROM %s" % MIGRATE_TABLE)
- return True
- except MySQLdb.ProgrammingError, exc:
- error_code, _ = exc.args
- if error_code == MySQLdb.constants.ER.NO_SUCH_TABLE:
- return False
- raise
+ def check_migrate_table_exists(self):
+ try:
+ self.execute("SELECT * FROM %s" % MIGRATE_TABLE)
+ return True
+ except MySQLdb.ProgrammingError, exc:
+ error_code, _ = exc.args
+ if error_code == MySQLdb.constants.ER.NO_SUCH_TABLE:
+ return False
+ raise
- def create_migrate_table(self):
- if not self.check_migrate_table_exists():
- self.execute("CREATE TABLE %s (`version` integer)" %
- MIGRATE_TABLE)
- else:
- self.execute("DELETE FROM %s" % MIGRATE_TABLE)
- self.execute("INSERT INTO %s VALUES (0)" % MIGRATE_TABLE)
- assert self.cursor.rowcount == 1
+ def create_migrate_table(self):
+ if not self.check_migrate_table_exists():
+ self.execute("CREATE TABLE %s (`version` integer)" %
+ MIGRATE_TABLE)
+ else:
+ self.execute("DELETE FROM %s" % MIGRATE_TABLE)
+ self.execute("INSERT INTO %s VALUES (0)" % MIGRATE_TABLE)
+ assert self.cursor.rowcount == 1
- def set_db_version(self, version):
- assert isinstance(version, int)
- self.execute("UPDATE %s SET version=%%s" % MIGRATE_TABLE,
- version)
- assert self.cursor.rowcount == 1
+ def set_db_version(self, version):
+ assert isinstance(version, int)
+ self.execute("UPDATE %s SET version=%%s" % MIGRATE_TABLE,
+ version)
+ assert self.cursor.rowcount == 1
- def get_db_version(self):
- if not self.check_migrate_table_exists():
- return 0
- self.execute("SELECT * FROM %s" % MIGRATE_TABLE)
- rows = self.cursor.fetchall()
- if len(rows) == 0:
- return 0
- assert len(rows) == 1 and len(rows[0]) == 1
- return rows[0][0]
+ def get_db_version(self):
+ if not self.check_migrate_table_exists():
+ return 0
+ self.execute("SELECT * FROM %s" % MIGRATE_TABLE)
+ rows = self.cursor.fetchall()
+ if len(rows) == 0:
+ return 0
+ assert len(rows) == 1 and len(rows[0]) == 1
+ return rows[0][0]
- def get_migrations(self, minimum_version=None, maximum_version=None):
- migrate_files = [filename for filename
- in os.listdir(self.migrations_dir)
- if re.match(r'^\d\d\d_.*\.py$', filename)]
- migrate_files.sort()
- migrations = [Migration(filename) for filename in migrate_files]
- if minimum_version is not None:
- migrations = [migration for migration in migrations
- if migration.version >= minimum_version]
- if maximum_version is not None:
- migrations = [migration for migration in migrations
- if migration.version <= maximum_version]
- return migrations
+ def get_migrations(self, minimum_version=None, maximum_version=None):
+ migrate_files = [filename for filename
+ in os.listdir(self.migrations_dir)
+ if re.match(r'^\d\d\d_.*\.py$', filename)]
+ migrate_files.sort()
+ migrations = [Migration(filename) for filename in migrate_files]
+ if minimum_version is not None:
+ migrations = [migration for migration in migrations
+ if migration.version >= minimum_version]
+ if maximum_version is not None:
+ migrations = [migration for migration in migrations
+ if migration.version <= maximum_version]
+ return migrations
- def do_migration(self, migration, migrate_up=True):
- print 'Applying migration %s' % migration.name, # no newline
- if migrate_up:
- print 'up'
- assert self.get_db_version() == migration.version - 1
- migration.migrate_up(self)
- new_version = migration.version
- else:
- print 'down'
- assert self.get_db_version() == migration.version
- migration.migrate_down(self)
- new_version = migration.version - 1
- self.set_db_version(new_version)
+ def do_migration(self, migration, migrate_up=True):
+ print 'Applying migration %s' % migration.name, # no newline
+ if migrate_up:
+ print 'up'
+ assert self.get_db_version() == migration.version - 1
+ migration.migrate_up(self)
+ new_version = migration.version
+ else:
+ print 'down'
+ assert self.get_db_version() == migration.version
+ migration.migrate_down(self)
+ new_version = migration.version - 1
+ self.set_db_version(new_version)
- def migrate_to_version(self, version):
- current_version = self.get_db_version()
- if current_version < version:
- lower, upper = current_version, version
- migrate_up = True
- else:
- lower, upper = version, current_version
- migrate_up = False
+ def migrate_to_version(self, version):
+ current_version = self.get_db_version()
+ if current_version < version:
+ lower, upper = current_version, version
+ migrate_up = True
+ else:
+ lower, upper = version, current_version
+ migrate_up = False
- migrations = self.get_migrations(lower + 1, upper)
- if not migrate_up:
- migrations.reverse()
- for migration in migrations:
- self.do_migration(migration, migrate_up)
+ migrations = self.get_migrations(lower + 1, upper)
+ if not migrate_up:
+ migrations.reverse()
+ for migration in migrations:
+ self.do_migration(migration, migrate_up)
- assert self.get_db_version() == version
- print 'At version', version
+ assert self.get_db_version() == version
+ print 'At version', version
- def get_latest_version(self):
- migrations = self.get_migrations()
- return migrations[-1].version
+ def get_latest_version(self):
+ migrations = self.get_migrations()
+ return migrations[-1].version
- def migrate_to_latest(self):
- latest_version = self.get_latest_version()
- self.migrate_to_version(latest_version)
+ def migrate_to_latest(self):
+ latest_version = self.get_latest_version()
+ self.migrate_to_version(latest_version)
- def initialize_test_db(self):
- self.read_db_info()
- test_db_name = 'test_' + self.db_name
- # first, connect to no DB so we can create a test DB
- self.db_name = ''
- self.open_connection()
- print 'Creating test DB', test_db_name
- self.execute('CREATE DATABASE ' + test_db_name)
- self.close_connection()
- # now connect to the test DB
- self.db_name = test_db_name
- self.open_connection()
+ def initialize_test_db(self):
+ self.read_db_info()
+ test_db_name = 'test_' + self.db_name
+ # first, connect to no DB so we can create a test DB
+ self.db_name = ''
+ self.open_connection()
+ print 'Creating test DB', test_db_name
+ self.execute('CREATE DATABASE ' + test_db_name)
+ self.close_connection()
+ # now connect to the test DB
+ self.db_name = test_db_name
+ self.open_connection()
- def remove_test_db(self):
- print 'Removing test DB'
- self.execute('DROP DATABASE ' + self.db_name)
+ def remove_test_db(self):
+ print 'Removing test DB'
+ self.execute('DROP DATABASE ' + self.db_name)
- def get_mysql_args(self):
- return ('-u %(user)s -p%(password)s -h %(host)s %(db)s' % {
- 'user' : self.username,
- 'password' : self.password,
- 'host' : self.db_host,
- 'db' : self.db_name})
+ def get_mysql_args(self):
+ return ('-u %(user)s -p%(password)s -h %(host)s %(db)s' % {
+ 'user' : self.username,
+ 'password' : self.password,
+ 'host' : self.db_host,
+ 'db' : self.db_name})
- def migrate_to_version_or_latest(self, version):
- if version is None:
- self.migrate_to_latest()
- else:
- self.migrate_to_version(version)
+ def migrate_to_version_or_latest(self, version):
+ if version is None:
+ self.migrate_to_latest()
+ else:
+ self.migrate_to_version(version)
- def do_sync_db(self, version=None):
- self.read_db_info()
- self.open_connection()
- print 'Migration starting for database', self.db_name
- self.migrate_to_version_or_latest(version)
- print 'Migration complete'
+ def do_sync_db(self, version=None):
+ self.read_db_info()
+ self.open_connection()
+ print 'Migration starting for database', self.db_name
+ self.migrate_to_version_or_latest(version)
+ print 'Migration complete'
- def test_sync_db(self, version=None):
- """\
- Create a fresh DB and run all migrations on it.
- """
- self.initialize_test_db()
- try:
- print 'Starting migration test on DB', self.db_name
- self.migrate_to_version_or_latest(version)
- # show schema to the user
- os.system('mysqldump %s --no-data=true '
- '--add-drop-table=false' %
- self.get_mysql_args())
- finally:
- self.remove_test_db()
- print 'Test finished successfully'
+ def test_sync_db(self, version=None):
+ """\
+ Create a fresh DB and run all migrations on it.
+ """
+ self.initialize_test_db()
+ try:
+ print 'Starting migration test on DB', self.db_name
+ self.migrate_to_version_or_latest(version)
+ # show schema to the user
+ os.system('mysqldump %s --no-data=true '
+ '--add-drop-table=false' %
+ self.get_mysql_args())
+ finally:
+ self.remove_test_db()
+ print 'Test finished successfully'
- def simulate_sync_db(self, version=None):
- """\
- Create a fresh DB, copy the existing DB to it, and then
- try to synchronize it.
- """
- self.read_db_info()
- self.open_connection()
- db_version = self.get_db_version()
- self.close_connection()
- # don't do anything if we're already at the latest version
- if db_version == self.get_latest_version():
- print 'Skipping simulation, already at latest version'
- return
- # get existing data
- self.read_db_info()
- print 'Dumping existing data'
- dump_fd, dump_file = tempfile.mkstemp('.migrate_dump')
- os.close(dump_fd)
- os.system('mysqldump %s >%s' %
- (self.get_mysql_args(), dump_file))
- # fill in test DB
- self.initialize_test_db()
- print 'Filling in test DB'
- os.system('mysql %s <%s' % (self.get_mysql_args(), dump_file))
- os.remove(dump_file)
- try:
- print 'Starting migration test on DB', self.db_name
- self.migrate_to_version_or_latest(version)
- finally:
- self.remove_test_db()
- print 'Test finished successfully'
+ def simulate_sync_db(self, version=None):
+ """\
+ Create a fresh DB, copy the existing DB to it, and then
+ try to synchronize it.
+ """
+ self.read_db_info()
+ self.open_connection()
+ db_version = self.get_db_version()
+ self.close_connection()
+ # don't do anything if we're already at the latest version
+ if db_version == self.get_latest_version():
+ print 'Skipping simulation, already at latest version'
+ return
+ # get existing data
+ self.read_db_info()
+ print 'Dumping existing data'
+ dump_fd, dump_file = tempfile.mkstemp('.migrate_dump')
+ os.close(dump_fd)
+ os.system('mysqldump %s >%s' %
+ (self.get_mysql_args(), dump_file))
+ # fill in test DB
+ self.initialize_test_db()
+ print 'Filling in test DB'
+ os.system('mysql %s <%s' % (self.get_mysql_args(), dump_file))
+ os.remove(dump_file)
+ try:
+ print 'Starting migration test on DB', self.db_name
+ self.migrate_to_version_or_latest(version)
+ finally:
+ self.remove_test_db()
+ print 'Test finished successfully'
USAGE = """\
@@ -282,37 +282,37 @@
def main():
- parser = OptionParser()
- parser.add_option("-d", "--database",
- help="which database to act on",
- dest="database")
- parser.add_option("-a", "--action", help="what action to perform",
- dest="action")
- (options, args) = parser.parse_args()
- manager = MigrationManager(options.database)
-
- if len(args) > 0:
- if len(args) > 1:
- version = int(args[1])
- else:
- version = None
- if args[0] == 'sync':
- manager.do_sync_db(version)
- elif args[0] == 'test':
- manager.test_sync_db(version)
- elif args[0] == 'simulate':
- manager.simulate_sync_db(version)
- elif args[0] == 'safesync':
- print 'Simluating migration'
- manager.simulate_sync_db(version)
- print 'Performing real migration'
- manager.do_sync_db(version)
- else:
- print USAGE
- return
-
- print USAGE
+ parser = OptionParser()
+ parser.add_option("-d", "--database",
+ help="which database to act on",
+ dest="database")
+ parser.add_option("-a", "--action", help="what action to perform",
+ dest="action")
+ (options, args) = parser.parse_args()
+ manager = MigrationManager(options.database)
+
+ if len(args) > 0:
+ if len(args) > 1:
+ version = int(args[1])
+ else:
+ version = None
+ if args[0] == 'sync':
+ manager.do_sync_db(version)
+ elif args[0] == 'test':
+ manager.test_sync_db(version)
+ elif args[0] == 'simulate':
+ manager.simulate_sync_db(version)
+ elif args[0] == 'safesync':
+ print 'Simluating migration'
+ manager.simulate_sync_db(version)
+ print 'Performing real migration'
+ manager.do_sync_db(version)
+ else:
+ print USAGE
+ return
+
+ print USAGE
if __name__ == '__main__':
- main()
+ main()
diff --git a/migrate/migrate_unittest.py b/migrate/migrate_unittest.py
index ec4ece1..d33dccd 100644
--- a/migrate/migrate_unittest.py
+++ b/migrate/migrate_unittest.py
@@ -13,140 +13,140 @@
NUM_MIGRATIONS = 3
class DummyMigration(object):
- """\
- Dummy migration class that records all migrations done in a class
- varaible.
- """
+ """\
+ Dummy migration class that records all migrations done in a class
+ varaible.
+ """
- migrations_done = []
+ migrations_done = []
- def __init__(self, version):
- self.version = version
- self.name = '%03d_test' % version
+ def __init__(self, version):
+ self.version = version
+ self.name = '%03d_test' % version
- @classmethod
- def get_migrations_done(cls):
- return cls.migrations_done
+ @classmethod
+ def get_migrations_done(cls):
+ return cls.migrations_done
- @classmethod
- def clear_migrations_done(cls):
- 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))
+ @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_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')
+ 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 __init__(self, database, migrations_dir=None):
- self.database = database
- self.migrations_dir = migrations_dir
- self.db_host = None
- self.db_name = None
- self.username = None
- self.password = None
+ def __init__(self, database, migrations_dir=None):
+ self.database = database
+ self.migrations_dir = migrations_dir
+ self.db_host = None
+ self.db_name = None
+ self.username = None
+ self.password = None
- def read_db_info(self):
- migrate.MigrationManager.read_db_info(self)
- self.db_name = 'test_' + self.db_name
+ def read_db_info(self):
+ migrate.MigrationManager.read_db_info(self)
+ self.db_name = 'test_' + self.db_name
- 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]
+ 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):
- config = global_config.global_config
- host = config.get_config_value(CONFIG_DB, 'host')
- db_name = 'test_' + config.get_config_value(CONFIG_DB, 'database')
- user = config.get_config_value(CONFIG_DB, 'user')
- password = config.get_config_value(CONFIG_DB, 'password')
+ config = global_config.global_config
+ host = config.get_config_value(CONFIG_DB, 'host')
+ db_name = 'test_' + config.get_config_value(CONFIG_DB, 'database')
+ user = config.get_config_value(CONFIG_DB, 'user')
+ password = config.get_config_value(CONFIG_DB, 'password')
- def do_sql(self, sql):
- self.con = MySQLdb.connect(host=self.host, user=self.user,
- passwd=self.password)
- self.con.autocommit(True)
- self.cur = self.con.cursor()
- try:
- self.cur.execute(sql)
- finally:
- self.con.close()
+ def do_sql(self, sql):
+ self.con = MySQLdb.connect(host=self.host, user=self.user,
+ passwd=self.password)
+ self.con.autocommit(True)
+ self.cur = self.con.cursor()
+ try:
+ self.cur.execute(sql)
+ finally:
+ self.con.close()
- def remove_db(self):
- self.do_sql('DROP DATABASE ' + self.db_name)
+ def remove_db(self):
+ self.do_sql('DROP DATABASE ' + self.db_name)
- def setUp(self):
- self.do_sql('CREATE DATABASE ' + self.db_name)
- try:
- self.manager = TestableMigrationManager(CONFIG_DB)
- except MySQLdb.OperationalError:
- self.remove_db()
- raise
- DummyMigration.clear_migrations_done()
+ def setUp(self):
+ self.do_sql('CREATE DATABASE ' + self.db_name)
+ try:
+ self.manager = TestableMigrationManager(CONFIG_DB)
+ except MySQLdb.OperationalError:
+ self.remove_db()
+ raise
+ DummyMigration.clear_migrations_done()
- def tearDown(self):
- self.remove_db()
+ def tearDown(self):
+ self.remove_db()
- 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')])
+ 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')])
+ 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'))
+ 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'))
+ 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(), [])
+ 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(), [])
if __name__ == '__main__':
- unittest.main()
+ unittest.main()