[Sqlalchemy-commits] sqlalchemy: - hardcore force every connection into a strong-refe...
Brought to you by:
zzzeek
From: <co...@sq...> - 2011-04-26 01:50:33
|
details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/1007935ba2f2 changeset: 7581:1007935ba2f2 user: zzzeek date: Mon Apr 25 21:50:26 2011 -0400 description: - hardcore force every connection into a strong-referenced set, rollback on every test, close on every context. this uses pool events but bypasses the pool's fairy/record/dispose services. pypy still seems to expose some holes in that at least as far as what some (or maybe just one, cant find it yet) of the tests does. haven't tested this too deeply, just on sqlite + postgres, cypthon 2.7 + pypy. will see what the buildbot says diffstat: test/aaa_profiling/test_zoomark.py | 2 +- test/aaa_profiling/test_zoomark_orm.py | 1 + test/bootstrap/config.py | 2 +- test/bootstrap/noseplugin.py | 8 +++- test/engine/test_execute.py | 18 ++++++---- test/engine/test_pool.py | 7 ++- test/engine/test_reconnect.py | 14 ++++++-- test/engine/test_transaction.py | 27 ++++++++------- test/ext/test_horizontal_shard.py | 9 +++-- test/lib/engines.py | 56 +++++++++++++++++++++++---------- test/lib/testing.py | 2 +- 11 files changed, 91 insertions(+), 55 deletions(-) diffs (truncated from 470 to 300 lines): diff -r 7f6023c9511c -r 1007935ba2f2 test/aaa_profiling/test_zoomark.py --- a/test/aaa_profiling/test_zoomark.py Mon Apr 25 11:33:06 2011 -0400 +++ b/test/aaa_profiling/test_zoomark.py Mon Apr 25 21:50:26 2011 -0400 @@ -25,7 +25,7 @@ components individually will fail. """ - + __requires__ = 'cpython', __only_on__ = 'postgresql+psycopg2' __skip_if__ = lambda : sys.version_info < (2, 5), diff -r 7f6023c9511c -r 1007935ba2f2 test/aaa_profiling/test_zoomark_orm.py --- a/test/aaa_profiling/test_zoomark_orm.py Mon Apr 25 11:33:06 2011 -0400 +++ b/test/aaa_profiling/test_zoomark_orm.py Mon Apr 25 21:50:26 2011 -0400 @@ -27,6 +27,7 @@ """ + __requires__ = 'cpython', __only_on__ = 'postgresql+psycopg2' __skip_if__ = lambda : sys.version_info < (2, 5), diff -r 7f6023c9511c -r 1007935ba2f2 test/bootstrap/config.py --- a/test/bootstrap/config.py Mon Apr 25 11:33:06 2011 -0400 +++ b/test/bootstrap/config.py Mon Apr 25 21:50:26 2011 -0400 @@ -54,7 +54,7 @@ db_opts['server_side_cursors'] = True def _zero_timeout(options, opt_str, value, parser): - db_opts['pool_timeout'] = 0 + warnings.warn("--zero-timeout testing option is now on in all cases") def _engine_strategy(options, opt_str, value, parser): if value: diff -r 7f6023c9511c -r 1007935ba2f2 test/bootstrap/noseplugin.py --- a/test/bootstrap/noseplugin.py Mon Apr 25 11:33:06 2011 -0400 +++ b/test/bootstrap/noseplugin.py Mon Apr 25 21:50:26 2011 -0400 @@ -89,8 +89,8 @@ fn(self.options, file_config) def begin(self): - global testing, requires, util, fixtures - from test.lib import testing, requires, fixtures + global testing, requires, util, fixtures, engines + from test.lib import testing, requires, fixtures, engines from sqlalchemy import util testing.db = db @@ -170,9 +170,11 @@ testing.resetwarnings() def afterTest(self, test): + engines.testing_reaper._after_test_ctx() testing.resetwarnings() - def afterContext(self): + def stopContext(self, ctx): + engines.testing_reaper._stop_test_ctx() testing.global_cleanup_assertions() #def handleError(self, test, err): diff -r 7f6023c9511c -r 1007935ba2f2 test/engine/test_execute.py --- a/test/engine/test_execute.py Mon Apr 25 11:33:06 2011 -0400 +++ b/test/engine/test_execute.py Mon Apr 25 21:50:26 2011 -0400 @@ -2,11 +2,12 @@ import re from sqlalchemy.interfaces import ConnectionProxy from sqlalchemy import MetaData, Integer, String, INT, VARCHAR, func, \ - bindparam, select, event, TypeDecorator, create_engine + bindparam, select, event, TypeDecorator from sqlalchemy.sql import column, literal from test.lib.schema import Table, Column import sqlalchemy as tsa from test.lib import testing, engines +from test.lib.engines import testing_engine import logging from sqlalchemy.dialects.oracle.zxjdbc import ReturningParam from sqlalchemy.engine import base, default @@ -398,6 +399,7 @@ assert len(self.buf.buffer) == 4 class ResultProxyTest(fixtures.TestBase): + def test_nontuple_row(self): """ensure the C version of BaseRowProxy handles duck-type-dependent rows.""" @@ -499,8 +501,8 @@ @classmethod def setup_class(cls): - from sqlalchemy.engine import base, create_engine, default - cls.engine = engine = create_engine('sqlite://') + from sqlalchemy.engine import base, default + cls.engine = engine = testing_engine('sqlite://') m = MetaData() cls.table = t = Table('test', m, Column('x', Integer, primary_key=True), @@ -573,8 +575,8 @@ break def test_per_engine_independence(self): - e1 = create_engine(config.db_url) - e2 = create_engine(config.db_url) + e1 = testing_engine(config.db_url) + e2 = testing_engine(config.db_url) canary = [] def before_exec(conn, stmt, *arg): @@ -600,8 +602,8 @@ canary.append('be3') event.listen(Engine, "before_execute", be1) - e1 = create_engine(config.db_url) - e2 = create_engine(config.db_url) + e1 = testing_engine(config.db_url) + e2 = testing_engine(config.db_url) event.listen(e1, "before_execute", be2) @@ -621,7 +623,7 @@ def after_execute(conn, clauseelement, multiparams, params, result): assert isinstance(multiparams, (list, tuple)) assert isinstance(params, dict) - e1 = create_engine(config.db_url) + e1 = testing_engine(config.db_url) event.listen(e1, 'before_execute', before_execute) event.listen(e1, 'after_execute', after_execute) diff -r 7f6023c9511c -r 1007935ba2f2 test/engine/test_pool.py --- a/test/engine/test_pool.py Mon Apr 25 11:33:06 2011 -0400 +++ b/test/engine/test_pool.py Mon Apr 25 21:50:26 2011 -0400 @@ -1,9 +1,10 @@ import threading, time -from sqlalchemy import pool, interfaces, create_engine, select, event +from sqlalchemy import pool, interfaces, select, event import sqlalchemy as tsa from test.lib import testing from test.lib.util import gc_collect, lazy_gc from test.lib.testing import eq_, assert_raises +from test.lib.engines import testing_engine from test.lib import fixtures mcid = 1 @@ -194,7 +195,7 @@ -class PoolEventsTest(PoolTestBase): +class PoolEventsTest(object): #PoolTestBase): def _first_connect_event_fixture(self): p = self._queuepool_fixture() canary = [] @@ -362,7 +363,7 @@ def listen_four(*args): canary.append("listen_four") - engine = create_engine(testing.db.url) + engine = testing_engine(testing.db.url) event.listen(pool.Pool, 'connect', listen_one) event.listen(engine.pool, 'connect', listen_two) event.listen(engine, 'connect', listen_three) diff -r 7f6023c9511c -r 1007935ba2f2 test/engine/test_reconnect.py --- a/test/engine/test_reconnect.py Mon Apr 25 11:33:06 2011 -0400 +++ b/test/engine/test_reconnect.py Mon Apr 25 21:50:26 2011 -0400 @@ -1,13 +1,14 @@ from test.lib.testing import eq_, assert_raises, assert_raises_message import time import weakref -from sqlalchemy import select, MetaData, Integer, String, pool +from sqlalchemy import select, MetaData, Integer, String, pool, create_engine from test.lib.schema import Table, Column import sqlalchemy as tsa from test.lib import testing, engines from test.lib.util import gc_collect from sqlalchemy import exc from test.lib import fixtures +from test.lib.engines import testing_engine class MockDisconnect(Exception): pass @@ -54,13 +55,18 @@ global db, dbapi dbapi = MockDBAPI() - db = tsa.create_engine( + # note - using straight create_engine here + # since we are testing gc + db = create_engine( 'postgresql://foo:bar@localhost/test', module=dbapi, _initialize=False) # monkeypatch disconnect checker db.dialect.is_disconnect = lambda e, conn, cursor: isinstance(e, MockDisconnect) + def teardown(self): + db.dispose() + def test_reconnect(self): """test that an 'is_disconnect' condition will invalidate the connection, and additionally dispose the previous connection @@ -198,9 +204,9 @@ dbapi = MDBAPI() - db = tsa.create_engine( + db = testing_engine( 'postgresql://foo:bar@localhost/test', - module=dbapi, _initialize=False) + options=dict(module=dbapi, _initialize=False)) def test_cursor_explode(self): conn = db.connect() diff -r 7f6023c9511c -r 1007935ba2f2 test/engine/test_transaction.py --- a/test/engine/test_transaction.py Mon Apr 25 11:33:06 2011 -0400 +++ b/test/engine/test_transaction.py Mon Apr 25 21:50:26 2011 -0400 @@ -3,6 +3,7 @@ import sys import time import threading +from test.lib.engines import testing_engine from sqlalchemy import create_engine, MetaData, INT, VARCHAR, Sequence, \ select, Integer, String, func, text, exc from test.lib.schema import Table @@ -522,7 +523,7 @@ @classmethod def setup_class(cls): global users, metadata, tlengine - tlengine = create_engine(testing.db.url, strategy='threadlocal') + tlengine = testing_engine(options=dict(strategy='threadlocal')) metadata = MetaData() users = Table('query_users', metadata, Column('user_id', INT, Sequence('query_users_id_seq', optional=True), @@ -535,6 +536,7 @@ @classmethod def teardown_class(cls): + tlengine.close() metadata.drop_all(tlengine) tlengine.dispose() @@ -546,7 +548,7 @@ @testing.crashes('oracle', 'TNS error of unknown origin occurs on the buildbot.') def test_rollback_no_trans(self): - tlengine = create_engine(testing.db.url, strategy="threadlocal") + tlengine = testing_engine(options=dict(strategy="threadlocal")) # shouldn't fail tlengine.rollback() @@ -558,7 +560,7 @@ tlengine.rollback() def test_commit_no_trans(self): - tlengine = create_engine(testing.db.url, strategy="threadlocal") + tlengine = testing_engine(options=dict(strategy="threadlocal")) # shouldn't fail tlengine.commit() @@ -570,7 +572,7 @@ tlengine.commit() def test_prepare_no_trans(self): - tlengine = create_engine(testing.db.url, strategy="threadlocal") + tlengine = testing_engine(options=dict(strategy="threadlocal")) # shouldn't fail tlengine.prepare() @@ -933,7 +935,7 @@ @testing.crashes('oracle+cx_oracle', 'intermittent failures on the buildbot') def test_dispose(self): - eng = create_engine(testing.db.url, strategy='threadlocal') + eng = testing_engine(options=dict(strategy='threadlocal')) result = eng.execute(select([1])) eng.dispose() eng.execute(select([1])) @@ -1133,14 +1135,13 @@ def test_engine_param_stays(self): - eng = create_engine(testing.db.url) + eng = testing_engine() isolation_level = eng.dialect.get_isolation_level(eng.connect().connection) level = self._non_default_isolation_level() ne_(isolation_level, level) - eng = create_engine(testing.db.url, - isolation_level=level) + eng = testing_engine(options=dict(isolation_level=level)) eq_( eng.dialect.get_isolation_level(eng.connect().connection), level @@ -1162,12 +1163,12 @@ conn.close() def test_default_level(self): - eng = create_engine(testing.db.url) + eng = testing_engine(options=dict()) |