]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Adjust test_concurrency failure modes
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 28 May 2019 01:15:47 +0000 (21:15 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 28 May 2019 01:17:54 +0000 (21:17 -0400)
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

test/ext/declarative/test_concurrency.py

index b73b65ec296a8f495c369bc7b90067b906a5ef6d..42d0b13a448eeffeda150c669b7726a5939704f7 100644 (file)
@@ -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]