From b08e8ab2dc65319670d99c81bec3af04fbb6d25f Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Thu, 23 Jan 2014 14:18:22 -0500 Subject: [PATCH] Re-write sqlite BigInteger mapping test This test makes sure that our hook that compiles BigInteger() into INTEGER for sqlite instead of BIGINT is working as we expect. Unfortunately, we've seen some problems running the sqlite command to check the schema. This patch rewrites the test to only use sqlalchemy APIs and avoid calling out to the sqlite command for verification. Change-Id: Id3964d0dd5b0ddf08ab745d6878840ff06b2f0dd Closes-bug: #1271331 (cherry picked from commit 74ade48634e2b72ec0b09792e97ac77dfb5fd999) --- nova/tests/db/test_sqlite.py | 39 ++++++++++++------------------------ 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/nova/tests/db/test_sqlite.py b/nova/tests/db/test_sqlite.py index fa9d1134ebf9..1479180cbcac 100644 --- a/nova/tests/db/test_sqlite.py +++ b/nova/tests/db/test_sqlite.py @@ -19,24 +19,16 @@ """Test cases for sqlite-specific logic""" -from nova.openstack.common import processutils from nova import test -from nova import utils -import os from sqlalchemy import create_engine from sqlalchemy import Column, BigInteger, String +import sqlalchemy.engine.reflection from sqlalchemy.ext.declarative import declarative_base class TestSqlite(test.NoDBTestCase): """Tests for sqlite-specific logic.""" - def setUp(self): - super(TestSqlite, self).setUp() - self.db_file = "test_bigint.sqlite" - if os.path.exists(self.db_file): - os.remove(self.db_file) - def test_big_int_mapping(self): base_class = declarative_base() @@ -46,22 +38,17 @@ class TestSqlite(test.NoDBTestCase): id = Column(BigInteger, primary_key=True) name = Column(String) - get_schema_cmd = "sqlite3 %s '.schema'" % self.db_file - engine = create_engine("sqlite:///%s" % self.db_file) + engine = create_engine('sqlite://') base_class.metadata.create_all(engine) - try: - output, _ = utils.execute(get_schema_cmd, shell=True) - except processutils.ProcessExecutionError as e: - # NOTE(alaski): If this check becomes necessary in other tests it - # should be moved into setUp. - if 'not found' in str(e): - self.skipTest(str(e)) - else: - raise - self.assertFalse('BIGINT' in output, msg="column type BIGINT " - "not converted to INTEGER in schema") - def tearDown(self): - if os.path.exists(self.db_file): - os.remove(self.db_file) - super(TestSqlite, self).tearDown() + insp = sqlalchemy.engine.reflection.Inspector.from_engine(engine) + + id_type = None + for column in insp.get_columns('users'): + if column['name'] == 'id': + id_type = column['type'].compile() + + # NOTE(russellb) We have a hook in nova.db.sqlalchemy that makes it so + # BigInteger() is compiled to INTEGER for sqlite instead of BIGINT. + + self.assertEqual('INTEGER', id_type)