From: Mike Bayer Date: Tue, 28 May 2019 01:15:47 +0000 (-0400) Subject: Adjust test_concurrency failure modes X-Git-Tag: rel_1_4_0b1~857 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8b2eb2a2d0f4c7e283d96cf3e5263b5dd48e3b14;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Adjust test_concurrency failure modes The test added for #4686 can raise for "B" missing which is normal and should not fail the test. Also ensure mappers are cleared to prevent subsequent tests elsewhere from being affected. Change-Id: I4c5791223e7fd21e04dcd095daa7d868e77dbd97 --- diff --git a/test/ext/declarative/test_concurrency.py b/test/ext/declarative/test_concurrency.py index b73b65ec29..42d0b13a44 100644 --- a/test/ext/declarative/test_concurrency.py +++ b/test/ext/declarative/test_concurrency.py @@ -3,18 +3,23 @@ import threading import time from sqlalchemy import Column +from sqlalchemy import exc from sqlalchemy import ForeignKey from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.orm import clear_mappers +from sqlalchemy.orm import exc as orm_exc from sqlalchemy.orm import relationship from sqlalchemy.orm import Session from sqlalchemy.testing import fixtures class ConcurrentUseDeclMappingTest(fixtures.TestBase): + def teardown(self): + clear_mappers() + @classmethod def make_a(cls, Base): class A(Base): @@ -34,12 +39,19 @@ class ConcurrentUseDeclMappingTest(fixtures.TestBase): A = cls.A try: s.query(A).join(A.bs) - except Exception as err: - result[0] = err - print(err) + except orm_exc.UnmappedClassError as oe: + # this is the failure mode, where B is being handled by + # declarative and is in the registry but not mapped yet. + result[0] = oe + except exc.InvalidRequestError as err: + # if make_b() starts too slowly, we can reach here, because + # B isn't in the registry yet. We can't guard against this + # case in the library because a class can refer to a name that + # doesn't exist and that has to raise. + result[0] = True else: + # no conflict result[0] = True - print("worked") @classmethod def make_b(cls, Base): @@ -74,5 +86,5 @@ class ConcurrentUseDeclMappingTest(fixtures.TestBase): for t in threads: t.join() - if isinstance(result[0], Exception): + if isinstance(result[0], orm_exc.UnmappedClassError): raise result[0]