
    he                     N   S r SSKrSSKrSSKJrJr  SSKJrJrJ	r	J
r
  SSKJrJrJr  SSKJr  SSKJr  SSKJr  S	r " S
 S5      r " S S5      r " S S5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS r\" \S\ " 5       5        \" \S\ " 5       5         " S S 5      r! " S! S"\RD                  5      r# " S# S$\RD                  5      r$ " S% S&5      r% " S' S(\	5      r& " S) S*5      r' " S+ S,\RD                  5      r(g)-z&
Tests for twisted.enterprise.adbapi.
    N)DictOptional)
ConnectionConnectionLostConnectionPoolTransaction)defer
interfacesreactor)FailurerequireModule)unittestz%
CREATE TABLE simple (
  x integer
)
c                       \ rS rSr% Sr0 r\\\4   \	S'   \
R                  " \S5      c  SrS rS rS rSS	 jrS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$Sr%g)ADBAPITestBase   z$
Test the asynchronous DB-API code.
openfun_calledN5ADB-API requires threads, no way to test without themc                     U R                  5         U R                  U R                  S9U l        U R                  R	                  5         g)zB
Set up the database and create a connection pool pointing at it.
)
cp_openfunN)startDBmakePoolopenfundbpoolstartselfs    _/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/test/test_adbapi.py
extraSetUpADBAPITestBase.extraSetUp(   s3     	mmt||m<    c                    ^  T R                   R                  S5      nUR                  U 4S j5        UR                  U 4S j5        U$ )NDROP TABLE simplec                 8   > TR                   R                  5       $ Nr   closeresr   s    r   <lambda>)ADBAPITestBase.tearDown.<locals>.<lambda>2       $++"3"3"5r!   c                 $   > TR                  5       $ r%   stopDBr(   s    r   r*   r+   3       $++-r!   r   runOperationaddCallbackr   ds   ` r   tearDownADBAPITestBase.tearDown0   7    KK$$%89	56	/0r!   c                 "    SU R                   U'   g )NT)r   r   conns     r   r   ADBAPITestBase.openfun6   s    $(D!r!   c                     U(       d  U R                  U R                  5        g U R                  XR                  5        g r%   )
assertTruer   assertInr:   s     r   checkOpenfunCalled!ADBAPITestBase.checkOpenfunCalled9   s)    OOD//0MM$ 3 34r!   c                   ^  T R                   R                  [        5      nT R                  (       a  UR	                  T R
                  5        UR	                  T R                  5        UR	                  T R                  5        UR	                  T R                  5        UR	                  U 4S j5        UR	                  T R                  5        UR	                  T R                  5        UR	                  T R                  5        UR	                  T R                  5        UR	                  T R                  5        UR	                  T R                  5        UR	                  T R                  5        UR	                  T R                   5        U$ )Nc                 $   > TR                  5       $ r%   )flushLoggedErrorsr(   s    r   r*   *ADBAPITestBase.test_pool.<locals>.<lambda>F   s    d&<&<&>r!   )r   r2   simple_table_schematest_failuresr3   _testPool_1_1_testPool_1_2_testPool_1_3_testPool_1_4_testPool_2_testPool_3_testPool_4_testPool_5_testPool_6_testPool_7_testPool_8_testPool_9r4   s   ` r   	test_poolADBAPITestBase.test_pool?   s   KK$$%89MM$,,-MM$,,-MM$,,-MM$,,-MM>?	d&&'	d&&'	d&&'	d&&'	d&&'	d&&'	d&&'	d&&'r!   c                    ^  [         R                  " T R                  R                  S5      nUR	                  U 4S jS 5        U$ )Nselect * from NOTABLEc                 &   > TR                  S5      $ Nzno exceptionfailr(   s    r   r*   .ADBAPITestBase._testPool_1_1.<locals>.<lambda>S       499^#<r!   c                     g r%    fs    r   r*   r\   S       r!   r	   maybeDeferredr   runQueryaddCallbacksr   r)   r5   s   `  r   rH   ADBAPITestBase._testPool_1_1Q   s4     4 46MN	<nMr!   c                    ^  [         R                  " T R                  R                  S5      nUR	                  U 4S jS 5        U$ )Nzdeletexxx from NOTABLEc                 &   > TR                  S5      $ rY   rZ   r(   s    r   r*   .ADBAPITestBase._testPool_1_2.<locals>.<lambda>X   r]   r!   c                     g r%   r_   r`   s    r   r*   rk   X   rb   r!   )r	   rd   r   r2   rf   rg   s   `  r   rI   ADBAPITestBase._testPool_1_2V   s4     8 8:RS	<nMr!   c                    ^  [         R                  " T R                  R                  T R                  5      nUR                  U 4S jS 5        U$ )Nc                 &   > TR                  S5      $ rY   rZ   r(   s    r   r*   .ADBAPITestBase._testPool_1_3.<locals>.<lambda>]   r]   r!   c                     g r%   r_   r`   s    r   r*   rp   ]   rb   r!   )r	   rd   r   runInteractionbad_interactionrf   rg   s   `  r   rJ   ADBAPITestBase._testPool_1_3[   s9     : :D<P<PQ	<nMr!   c                    ^  [         R                  " T R                  R                  T R                  5      nUR                  U 4S jS 5        U$ )Nc                 &   > TR                  S5      $ rY   rZ   r(   s    r   r*   .ADBAPITestBase._testPool_1_4.<locals>.<lambda>b   r]   r!   c                     g r%   r_   r`   s    r   r*   rw   b   rb   r!   )r	   rd   r   runWithConnectionbad_withConnectionrf   rg   s   `  r   rK   ADBAPITestBase._testPool_1_4`   s9     = =t?V?VW	<nMr!   c                 p   ^  SnT R                   R                  U5      nU 4S jnUR                  U5        U$ )Nselect count(1) from simplec                 n   > TR                  [        U S   S   5      S:H  S5        TR                  5         g )Nr   zInteraction not rolled back)r>   intr@   rowr   s    r   _check*ADBAPITestBase._testPool_2.<locals>._checkj   s/    OOCAq	Na/1NO##%r!   r   re   r3   r   r)   sqlr5   r   s   `    r   rL   ADBAPITestBase._testPool_2e   s4    +KK  %	& 	
fr!   c                 .  ^  Sn/ n[        T R                  5       H2  nSU-  nUR                  T R                  R	                  U5      5        M4     [
        R                  " U5      nU 4S jnUR                  U5        U 4S jnUR                  U5        U$ )Nr}   z insert into simple(x) values(%d)c                 B   > SnTR                   R                  U5      nU$ )Nselect x from simple order by x)r   re   )r)   r   r5   r   s      r   _select+ADBAPITestBase._testPool_3.<locals>._selectz   s!    3C$$S)AHr!   c                   > TR                  [        U 5      TR                  :H  S5        [        TR                  5       H=  nTR                  [        X   5      S:H  S5        TR                  X   S   U:H  S5        M?     g )NzWrong number of rows   Wrong size rowr   zValues not returned.)r>   lennum_iterationsrange)rowsir   s     r   r   *ADBAPITestBase._testPool_3.<locals>._check   si    OOCI)<)<<>TU4../DG 13CD
a1GH 0r!   )r   r   appendr   r2   r	   gatherResultsr3   )r   r)   r   insertsr   r5   r   r   s   `       r   rM   ADBAPITestBase._testPool_3q   s    +t**+A4q8CNN4;;33C89 , (	 	
g	I 	
fr!   c                 |   ^  T R                   R                  T R                  5      nUR                  U 4S j5        U$ )Nc                 (   > TR                  U S5      $ NdoneassertEqualr(   s    r   r*   ,ADBAPITestBase._testPool_4.<locals>.<lambda>       $"2"23"?r!   )r   rr   interactionr3   rg   s   `  r   rN   ADBAPITestBase._testPool_4   s/    KK&&t'7'78	?@r!   c                 |   ^  T R                   R                  T R                  5      nUR                  U 4S j5        U$ )Nc                 (   > TR                  U S5      $ r   r   r(   s    r   r*   ,ADBAPITestBase._testPool_5.<locals>.<lambda>   r   r!   )r   ry   withConnectionr3   rg   s   `  r   rO   ADBAPITestBase._testPool_5   s/    KK))$*=*=>	?@r!   c                 P    U R                   R                  U R                  5      nU$ r%   )r   ry   close_withConnectionrg   s      r   rP   ADBAPITestBase._testPool_6   s!    KK))$*C*CDr!   c                    ^  / n[        T R                  5       H2  nSU-  nUR                  T R                  R	                  U5      5        M4     [
        R                  " USS9nU 4S jnUR                  U5        U$ )Nz!select x from simple where x = %dTfireOnOneErrbackc                 ~   > [        TR                  5       H#  nTR                  X   S   S   S   U:H  S5        M%     g )Nr   r   zValue not returned)r   r   r>   )resultr   r   s     r   r   *ADBAPITestBase._testPool_7.<locals>._check   s;    4../	!Q 2a 79MN 0r!   )r   r   r   r   re   r	   DeferredListr3   )r   r)   dsr   r   dlistr   s   `      r   rQ   ADBAPITestBase._testPool_7   sq    t**+A59CIIdkk**3/0 , ""2=	O 	&!r!   c                     / n[        U R                  5       H2  nSU-  nUR                  U R                  R	                  U5      5        M4     [
        R                  " USS9nU$ )Nzdelete from simple where x = %dTr   )r   r   r   r   r2   r	   r   )r   r)   r   r   r   r   s         r   rR   ADBAPITestBase._testPool_8   sZ    t**+A3a7CIIdkk..s34 , ""2=r!   c                 p   ^  SnT R                   R                  U5      nU 4S jnUR                  U5        U$ )Nr}   c                 n   > TR                  [        U S   S   5      S:H  S5        TR                  5         g )Nr   z)Didn't successfully delete table contents)r>   r   checkConnectr   s    r   r   *ADBAPITestBase._testPool_9.<locals>._check   s4    OOCF1I!#%P r!   r   r   s   `    r   rS   ADBAPITestBase._testPool_9   s4    +KK  %	  	
fr!   c                 l   U R                   R                  5       nU R                  U5        UR                  5       nUR	                  S5        UR	                  S5        UR                  5       nU R                  [        U5      S5        U R                  [        US   5      S5        U R                  US   S   S5        UR	                  S5        UR	                  S5        U R                  [        UR                  5       5      S5        UR                  5         U R                   R                  U5        g)z/Check the connect/disconnect synchronous calls.zinsert into simple(x) values(1)zselect x from simpler   r   zdelete from simpleN)
r   connectr@   cursorexecutefetchallr   r   r'   
disconnect)r   r;   cursr)   s       r   r   ADBAPITestBase.checkConnect   s    {{""$%{{}67+,mmoS1%SVa(QA&)*+,T]]_-q1

t$r!   c                 *   UR                  S5        [        U R                  5       HI  nUR                  5       nU R	                  [        U5      S:H  S5        U R	                  US   U:H  S5        MK     U R                  UR                  5       S5        g)Nr   r   r   r   Value not returned.zToo many rowsr   )r   r   r   fetchoner>   r   assertIsNone)r   transactionr   r   s       r   r   ADBAPITestBase.interaction   s    =>t**+A&&(COOCHM+;<OOCFaK)>? , 	+..0/Br!   c                 j    U R                   (       a  UR                  S5        UR                  S5        g )Nzinsert into simple(x) values(0)rW   )can_rollbackr   )r   r   s     r   rs   ADBAPITestBase.bad_interaction   s)     AB34r!   c                 V   UR                  5       n UR                  S5        [        U R                  5       HI  nUR	                  5       nU R                  [        U5      S:H  S5        U R                  US   U:H  S5        MK     UR                  5         g! UR                  5         f = f)Nr   r   r   r   r   r   )r   r   r   r   r   r>   r   r'   )r   r;   r   r   r   s        r   r   ADBAPITestBase.withConnection   s    {{}	LL:;4../mmoCA/?@A!-BC 0
 JJL JJLs   A3B B(c                 $    UR                  5         g r%   )r'   r:   s     r   r   #ADBAPITestBase.close_withConnection   s    

r!   c                     UR                  5       n UR                  S5        UR                  5         g ! UR                  5         f = f)NrW   )r   r   r'   )r   r;   r   s      r   rz   !ADBAPITestBase.bad_withConnection   s2    {{}	LL01JJLDJJLs	   4 Ar   r%   )&__name__
__module____qualname____firstlineno____doc__r   r   objectbool__annotations__r
   IReactorThreadsr   skipr   r6   r   r@   rT   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   r   r   rs   r   r   rz   __static_attributes__r_   r!   r   r   r      s     *,ND&+!!'408F)5$




6
%"5
r!   r   c                   t    \ rS rSrSr\R                  " \S5      c  SrS r	S r
S rS rS	 rS
 rS rS rSrg)ReconnectTestBase   z3
Test the asynchronous DB-API code with reconnect.
Nr   c                    U R                   c  [        R                  " S5      eU R                  5         U R	                  SSU R                   S9U l        U R
                  R                  5         U R
                  R                  [        5      $ )z
Skip the test if C{good_sql} is unavailable.  Otherwise, set up the
database, create a connection pool pointed at it, and set up a simple
schema in it.
zno good sql for reconnect testr   T)cp_maxcp_reconnectcp_good_sql)	good_sqlr   SkipTestr   r   r   r   r2   rF   r   s    r   r   ReconnectTestBase.extraSetUp  sq     == ##$DEEmm4T]] $ 
 	{{''(;<<r!   c                    ^  T R                   R                  S5      nUR                  U 4S j5        UR                  U 4S j5        U$ )Nr#   c                 8   > TR                   R                  5       $ r%   r&   r(   s    r   r*   ,ReconnectTestBase.tearDown.<locals>.<lambda>  r,   r!   c                 $   > TR                  5       $ r%   r.   r(   s    r   r*   r     r0   r!   r1   r4   s   ` r   r6   ReconnectTestBase.tearDown  r8   r!   c                 b   [         R                  " S 5      nUR                  U R                  5        UR                  U R                  5        U R
                  (       d  UR                  U R                  5        UR                  U R                  5        UR                  U R                  5        U$ r%   )	r	   succeedr3   _testPool_1rL   early_reconnectrM   rN   rO   r4   s     r   rT   ReconnectTestBase.test_pool  sx    MM$	d&&'	d&&'##MM$**+	d&&'	d&&'r!   c                 p   ^  SnT R                   R                  U5      nU 4S jnUR                  U5        U$ )Nr}   c                 N   > TR                  [        U S   S   5      S:H  S5        g Nr   zTable not emptyr>   r   r   s    r   r   -ReconnectTestBase._testPool_1.<locals>._check%  #    OOCAq	Na/1BCr!   r   r   s   `    r   r   ReconnectTestBase._testPool_1!  5    +KK  %	D 	
fr!   c                     [        U R                  R                  R                  5       5      S   R	                  5         g )Nr   )listr   connectionsvaluesr'   )r   r)   s     r   rL   ReconnectTestBase._testPool_2+  s+    T[[$$++-.q1779r!   c                    ^  Sn[         R                  " T R                  R                  U5      nUR	                  U 4S jS 5        U$ )Nr}   c                 &   > TR                  S5      $ rY   rZ   r(   s    r   r*   /ReconnectTestBase._testPool_3.<locals>.<lambda>2  r]   r!   c                     g r%   r_   r`   s    r   r*   r  2  rb   r!   rc   r   r)   r   r5   s   `   r   rM   ReconnectTestBase._testPool_3/  s8    + 4 4c:	<nMr!   c                 p   ^  SnT R                   R                  U5      nU 4S jnUR                  U5        U$ )Nr}   c                 N   > TR                  [        U S   S   5      S:H  S5        g r   r   r   s    r   r   -ReconnectTestBase._testPool_4.<locals>._check9  r   r!   r   r   s   `    r   rN   ReconnectTestBase._testPool_45  r   r!   c                    ^  T R                  5         Sn[        R                  " T R                  R                  U5      nUR                  U 4S jU 4S j5        U$ )NrW   c                 &   > TR                  S5      $ rY   rZ   r(   s    r   r*   /ReconnectTestBase._testPool_5.<locals>.<lambda>D  s    		.1r!   c                 L   > TR                  U R                  [        5      5      $ r%   )assertFalsecheckr   )ra   r   s    r   r*   r  E  s    d&&qww~'>?r!   )rD   r	   rd   r   re   rf   r  s   `   r   rO   ReconnectTestBase._testPool_5?  sI     % 4 4c:	1?	
 r!   r   )r   r   r   r   r   r
   r   r   r   r   r6   rT   r   rL   rM   rN   rO   r   r_   r!   r   r   r      sI     !!'408F=:r!   r   c                       \ rS rSr% SrSr\\   \S'   Sr	Sr
SrSrSrSrSrSrSr\R&                  r\\   \S'   SrSrSrS	 rS
 rS rS rS rS rSrg)DBTestConnectoriJ  a&  
A class which knows how to test for the presence of
and establish a connection to a relational database.

To enable test cases  which use a central, system database,
you must create a database named DB_NAME with a user DB_USER
and password DB_PASS with full access rights to database DB_NAME.
NTEST_PREFIXtwisted_testTr   2   c                     U R                  5       U l        [        R                  " U R                  5        U R	                  5       (       d#  [
        R                  " SU R                  -  5      eU R                  5       $ )Nz%s: Cannot access db)	mktempDB_DIRosmkdircan_connectr   r   r  r   r   s    r   setUpDBTestConnector.setUpi  sX    kkm
!!##$:T=M=M$MNN  r!   c                     [        5       e)zPReturn true if this database is present on the system
and can be used in a test.NotImplementedErrorr   s    r   r  DBTestConnector.can_connectp  s     "##r!   c                     g)z+Take any steps needed to bring database up.Nr_   r   s    r   r   DBTestConnector.startDBu      r!   c                     g)zBring database down, if needed.Nr_   r   s    r   r/   DBTestConnector.stopDBy  r%  r!   c                 ~    U R                  5       u  p#UR                  5       nUR                  U5        [        U0 UD6$ )z;Create a connection pool with additional keyword arguments.)getPoolArgscopyupdater   )r   newkwargskws       r   r   DBTestConnector.makePool}  s9    ##%WWY
		%t*r**r!   c                     [        5       e)zReturn a tuple (args, kw) of list and keyword arguments
that need to be passed to ConnectionPool to create a connection
to this database.r   r   s    r   r)  DBTestConnector.getPoolArgs  s     "##r!   )r  )r   r   r   r   r   r  r   strr   DB_NAMEDB_USERDB_PASSr  nulls_oktrailing_spaces_okr   rG   escape_slashesr   r   r   	can_clearr   r  r  r   r/   r   r)  r   r_   r!   r   r  r  J  s     "&K#%GGGFHLMN,55Hhsm5OI N!$
+$r!   r  c                   6    \ rS rSrSrSrSrSrS rS r	S r
S	rg
)SQLite3Connectori  z:
Connector that uses the stdlib SQLite3 database support.
SQLite3Fr   c                     [        S5      c  gg)Nsqlite3FTr   r   s    r   r  SQLite3Connector.can_connect  s    #+r!   c                    [         R                  R                  U R                  U R                  5      U l        [         R                  R                  U R
                  5      (       a!  [         R                  " U R
                  5        g g r%   r  pathjoinr  r3  databaseexistsunlinkr   s    r   r   SQLite3Connector.startDB  L    T[[$,,?77>>$--((IIdmm$ )r!   c                 ,    SnU R                   SSS.nX4$ )N)r>  r   FrD  r   check_same_threadrD  r   r-  r.  s      r   r)  SQLite3Connector.getPoolArgs  s    --15Qxr!   rL  Nr   r   r   r   r   r  r8  r   r  r   r)  r   r_   r!   r   r;  r;    s'     KNN%
r!   r;  c                   6    \ rS rSrSrSrSrSrS rS r	S r
S	rg
)PySQLite2Connectori  z9
Connector that uses pysqlite's SQLite database support.
	pysqlite2Fr   c                     [        S5      c  gg)Npysqlite2.dbapi2FTr   r   s    r   r  PySQLite2Connector.can_connect  s    +,4r!   c                    [         R                  R                  U R                  U R                  5      U l        [         R                  R                  U R
                  5      (       a!  [         R                  " U R
                  5        g g r%   rA  r   s    r   r   PySQLite2Connector.startDB  rH  r!   c                 ,    SnU R                   SSS.nX4$ )N)rT  r   FrJ  rL  rM  s      r   r)  PySQLite2Connector.getPoolArgs  s    $--15Qxr!   rL  NrO  r_   r!   r   rQ  rQ    s'     KNN%
r!   rQ  c                   $    \ rS rSrSrS rS rSrg)PyPgSQLConnectori  PyPgSQLc                      SSK Jn   UR                  U R                  U R
                  U R                  S9nUR                  5         g! [         a     gf = f! [         a     gf = f)Nr   )PgSQLFrD  userpasswordT)pyPgSQLr^  BaseExceptionr   r3  r4  r5  r'   )r   r^  r;   s      r   r  PyPgSQLConnector.can_connect  sj    	%	==DLL4<< ! D JJL  		  		s"   A	 ?A 	
AA
A&%A&c                 V    SnU R                   U R                  U R                  SS.nX4$ )N)zpyPgSQL.PgSQLr   rD  r`  ra  cp_minr3  r4  r5  rM  s      r   r)  PyPgSQLConnector.getPoolArgs  s/    !LL	
 xr!   r_   Nr   r   r   r   r  r  r)  r   r_   r!   r   r[  r[        Kr!   r[  c                   $    \ rS rSrSrS rS rSrg)PsycopgConnectori  Psycopgc                      SS K n UR                  U R                  U R                  U R
                  S9nUR                  5         g! [         a     gf = f! [         a     gf = f)Nr   Fr_  T)psycopgrc  r   r3  r4  r5  r'   )r   rp  r;   s      r   r  PsycopgConnector.can_connect  sj    		??DLL4<< # D JJL  		  		"   A ?A 
AA
A$#A$c                 V    SnU R                   U R                  U R                  SS.nX4$ )N)rp  r   rf  rh  rM  s      r   r)  PsycopgConnector.getPoolArgs  s/    LL	
 xr!   r_   Nrj  r_   r!   r   rm  rm    rk  r!   rm  c                   0    \ rS rSrSrSrSrSrS rS r	Sr
g)MySQLConnectori  MySQLFc                      SS K n UR                  U R                  U R                  U R
                  S9nUR                  5         g! [         a     gf = f! [         a     gf = f)Nr   Fdbr`  passwdT)MySQLdbrc  r   r3  r4  r5  r'   )r   r|  r;   s      r   r  MySQLConnector.can_connect  sj    		??<<dll4<< # D JJL  		  		rr  c                 T    SnU R                   U R                  U R                  S.nX4$ )N)r|  ry  rh  rM  s      r   r)  MySQLConnector.getPoolArgs  s&    LL$,,$,,Oxr!   r_   N)r   r   r   r   r  r7  r   r   r  r)  r   r_   r!   r   rv  rv    s!    KLOr!   rv  c                   D    \ rS rSrSrSrSrSrSrSr	S r
S rS rS	 rS
rg)FirebirdConnectori  FirebirdFN   c                     [        S5      c  g U R                  5         U R                  5         g! [         a     gf = f)NkinterbasdbFT)r   r   r/   rc  r   s    r   r  FirebirdConnector.can_connect  s<    '/	LLNKKM 		s    0 
==c                    SS K n[        R                  R                  U R                  [
        R                  5      U l        [        R                  " U R                  [        R                  [        R                  -   [        R                  -   5        SnX R                  U R                  U R                  4-  nUR                  U5      nUR                  5         g )Nr   z,create database "%s" user "%s" password "%s")r  r  rB  rC  r  r  r3  chmodstatS_IRWXUS_IRWXGS_IRWXOr4  r5  create_databaser'   )r   r  r   r;   s       r   r   FirebirdConnector.startDB&  s    ww||DKK1H1HI
dllT\\9DLLHI<dllDLL99**3/

r!   c                 V    SnU R                   SU R                  U R                  S.nX4$ )N)r  	127.0.0.1rD  hostr`  ra  rh  rM  s      r   r)  FirebirdConnector.getPoolArgs0  s/    LL	
 xr!   c                     SS K nUR                  U R                  SU R                  U R                  S9nUR                  5         g )Nr   r  r  )r  r   r3  r4  r5  drop_database)r   r  r;   s      r   r/   FirebirdConnector.stopDB:  s@    ""\\\\	 # 
 	r!   )r3  )r   r   r   r   r  rG   r8  r   r9  r   r  r   r)  r/   r   r_   r!   r   r  r    s4    KMNHIN	r!   r  c                 x  ^ [         [        [        [        [        [
        /n0 nU H  mTR                  U-   n " U4S jSTU [        R                  5      nXVl	        [        TS5      (       a5  SR                  TR                  R                  5       SS U/-   5      Ul        XdU'   M     UR                  U5        g)a9  
Make a test case for every db connector which can connect.

@param base: Base class for test case. Additional base classes
             will be a DBConnector subclass and unittest.TestCase
@param suffix: A suffix used to create test case names. Prefixes
               are defined in the DBConnector subclasses.
c                   0   > \ rS rSr Y R                  rSrg)makeSQLTests.<locals>.testcasei[  r_   N)r   r   r   r   r   )	connclasss   r   testcaser  [  s    "--Jr!   r  r   .r   N)rQ  r;  r[  rm  rv  r  r  r   TestCaser   hasattrrC  r   splitr+  )basesuffixglobals
connectorstestsnamer  r  s          @r   makeSQLTestsr  F  s     	J E	$$v-	.y$(9(9 	. !9n--$'HH&&,,.q4v=%H! d   NN5r!   ADBAPITestsReconnectTestsc                   2    \ rS rSrSrSrSrS rS rS r	Sr
g)	FakePooliq  z
A fake L{ConnectionPool} for tests.

@ivar connectionFactory: factory for making connections returned by the
    C{connect} method.
@type connectionFactory: any callable
Tc                     Xl         g r%   connectionFactory)r   r  s     r   __init__FakePool.__init__}  s    !2r!   c                 "    U R                  5       $ )z2
Return an instance of C{self.connectionFactory}.
r  r   s    r   r   FakePool.connect  s     %%''r!   c                     g)z
Do nothing.
Nr_   )r   
connections     r   r   FakePool.disconnect  s    r!   r  N)r   r   r   r   r   	reconnectnoisyr  r   r   r   r_   r!   r   r  r  q  s"     IE3(r!   r  c                       \ rS rSrSrS rSrg)ConnectionTestsi  z$
Tests for the L{Connection} class.
c                 <    " S S5      n[        U5      n[        U5      nU R                  [        UR                  5        U R                  [        5      nU R                  [        U5      S5        U R                  US   R                  R                  S   S5        g)zd
If an error happens during rollback, L{ConnectionLost} is raised but
the original error is logged.
c                       \ rS rSrS rSrg)IConnectionTests.test_rollbackErrorLogged.<locals>.ConnectionRollbackRaisei  c                     [        S5      eNproblem!RuntimeErrorr   s    r   rollbackRConnectionTests.test_rollbackErrorLogged.<locals>.ConnectionRollbackRaise.rollback      ":..r!   r_   N)r   r   r   r   r  r   r_   r!   r   ConnectionRollbackRaiser        /r!   r  r   r   r  N)r  r   assertRaisesr   r  rD   r  r   r   valuer-  )r   r  poolr  errorss        r   test_rollbackErrorLogged(ConnectionTests.test_rollbackErrorLogged  s    	/ 	/ /0%
.**=*=>''5Va(--a0*=r!   r_   N)r   r   r   r   r   r  r   r_   r!   r   r  r    s    >r!   r  c                       \ rS rSrSrS rSrg)TransactionTestsi  z%
Tests for the L{Transaction} class.
c                 &    " S S5      n[        S5      n[        X!" 5       5      nUR                  5         U R                  [        5      nU R                  [        U5      S5        U R                  US   R                  R                  S   S5        g)zl
If the cursor creation raises an error in L{Transaction.reopen}, it
reconnects but log the error occurred.
c                   $    \ rS rSrSrS rS rSrg)NTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaisei  r   c                     g r%   r_   r   s    r   r  XTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaise.reconnect      r!   c                 d    U R                   S:X  a   U =R                   S-  sl         [        S5      eg )Nr   r   r  )countr  r   s    r   r   UTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaise.cursor  s*    ::?JJ!OJ&z22 #r!   r_   N)r   r   r   r   r  r  r   r   r_   r!   r   ConnectionCursorRaiser    s    E3r!   r  Nr   r   r  )	r  r   reopenrD   r  r   r   r  r-  )r   r  r  r   r  s        r   test_reopenLogErrorIfReconnect/TransactionTests.test_reopenLogErrorIfReconnect  sz    		3 		3 ~!$(=(?@''5Va(--a0*=r!   r_   N)r   r   r   r   r   r  r   r_   r!   r   r  r    s    >r!   r  c                       \ rS rSrS rSrg)NonThreadPooli  c                 b    Sn U" U0 UD6nU" XV5        g ! [          a    Sn[        5       n N!f = f)NTF)	Exceptionr   )r   onResultra   ar.  successr   s          r   callInThreadWithCallback&NonThreadPool.callInThreadWithCallback  s@    	[R[F 	!  	GYF	s    ..r_   N)r   r   r   r   r  r   r_   r!   r   r  r    s    "r!   r  c                   ,    \ rS rSrSr\" 5       rS rSrg)DummyConnectionPooli  z
A testable L{ConnectionPool};
c                     [         U l        g)z
Don't forward init call.
N)r   _reactorr   s    r   r  DummyConnectionPool.__init__  s      r!   )r  N)	r   r   r   r   r   r  
threadpoolr  r   r_   r!   r   r  r    s     J r!   r  c                   0    \ rS rSrSrS rS rS rS rSr	g)	EventReactori  z
Partial L{IReactorCore} implementation with simple event-related
methods.

@ivar _running: A C{bool} indicating whether the reactor is pretending
    to have been started already or not.

@ivar triggers: A C{list} of pending system event triggers.
c                     Xl         / U l        g r%   _runningtriggers)r   runnings     r   r  EventReactor.__init__  s    r!   c                 Z    U R                   (       a  U" 5         g U R                  SSU5      $ )Nafterstartup)r  addSystemEventTrigger)r   functions     r   callWhenRunningEventReactor.callWhenRunning  s#    ==J--gy(KKr!   c                 D    XU4nU R                   R                  U5        U$ r%   )r  r   )r   phaseeventtriggerhandles        r   r  "EventReactor.addSystemEventTrigger  s#    (V$r!   c                 :    U R                   R                  U5        g r%   )r  remove)r   r  s     r   removeSystemEventTrigger%EventReactor.removeSystemEventTrigger  s    V$r!   r  N)
r   r   r   r   r   r  r  r  r  r   r_   r!   r   r  r    s    L
%r!   r  c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
ConnectionPoolTestsi  z#
Unit tests for L{ConnectionPool}.
c                    ^   " S S5      nS n[        5       nXl        UR                  U5      nT R                  U[        5      nU 4S jnUR                  U5        U$ )zy
If rollback fails, L{ConnectionPool.runWithConnection} raises the
original exception and log the error of the rollback.
c                        \ rS rSrS rS rSrg)]ConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaisei  c                     g r%   r_   r   r  s     r   r  fConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaise.__init__  r  r!   c                     [        S5      er  r  r   s    r   r  fConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaise.rollback  r  r!   r_   Nr   r   r   r   r  r  r   r_   r!   r   r  r        /r!   r  c                     [        S5      eNfoo
ValueError)r  s    r   raisingFunctionUConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.raisingFunction
      U##r!   c                    > TR                  [        5      nTR                  [        U5      S5        TR                  US   R                  R
                  S   S5        g Nr   r   r  rD   r  r   r   r  r-  ignoredr  r   s     r   cbFailedNConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.cbFailed  J    ++L9FS[!,VAY__11!4jAr!   )r  r  ry   assertFailurer  r3   )r   r  r  r  r5   r  s   `     r   (test_runWithConnectionRaiseOriginalError<ConnectionPoolTests.test_runWithConnectionRaiseOriginalError  s]    	/ 	/	$ #$!8""?3q*-	B
 	
hr!   c                     " S S5      n[        5       nUR                  U" 5       5        U R                  [        5      nU R	                  [        U5      S5        U R	                  US   R                  R                  S   S5        g)z+
L{ConnectionPool._close} logs exceptions.
c                       \ rS rSrS rSrg)DConnectionPoolTests.test_closeLogError.<locals>.ConnectionCloseRaisei  c                     [        S5      er  r  r   s    r   r'   JConnectionPoolTests.test_closeLogError.<locals>.ConnectionCloseRaise.close   r  r!   r_   N)r   r   r   r   r'   r   r_   r!   r   ConnectionCloseRaiser%    r  r!   r(  r   r   r  N)r  _closerD   r  r   r   r  r-  )r   r(  r  r  s       r   test_closeLogError&ConnectionPoolTests.test_closeLogError  sm    
	/ 	/ #$(*+''5Va(--a0*=r!   c                    ^   " S S5      n " S S5      nS n[        5       nXl        X$l        UR                  U5      nT R	                  U[
        5      nU 4S jnUR                  U5        U$ )zv
If rollback fails, L{ConnectionPool.runInteraction} raises the
original exception and log the error of the rollback.
c                        \ rS rSrS rS rSrg)^ConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaisei0  c                     g r%   r_   r
  s     r   r  gConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaise.__init__1  r  r!   c                     [        S5      er  r  r   s    r   r  gConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaise.rollback4  r  r!   r_   Nr  r_   r!   r   r  r.  0  r  r!   r  c                       \ rS rSrS rSrg)WConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.DummyTransactioni7  c                     g r%   r_   )r   r  r  s      r   r  `ConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.DummyTransaction.__init__8  r  r!   r_   N)r   r   r   r   r  r   r_   r!   r   DummyTransactionr4  7  s    r!   r7  c                     [        S5      er  r  )r   s    r   r  VConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.raisingFunction;  r  r!   c                    > TR                  [        5      nTR                  [        U5      S5        TR                  US   R                  R
                  S   S5        g r  r  r  s     r   r  OConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.cbFailedE  r  r!   )r  r  transactionFactoryrr   r   r  r3   )r   r  r7  r  r  r5   r  s   `      r   )test_runWithInteractionRaiseOriginalError=ConnectionPoolTests.test_runWithInteractionRaiseOriginalError*  sm    	/ 	/	 		$ #$!8"20q*-	B
 	
hr!   c                     [        S5      n[        SUS9nU R                  UR                  SSUR                  4/5        UR                  5         U R                  UR                  5        g)z
If L{ConnectionPool.close} is called without L{ConnectionPool.start}
having been called, the pool's startup event is cancelled.
Ftwisted.test.test_adbapi
cp_reactorr  r  N)r  r   r   r  _startr'   r  r   r   r  s      r   test_unstartedClose'ConnectionPoolTests.test_unstartedCloseM  s\    
 u%8WM))Wi,M+NO

))*r!   c                     [        S5      n[        SUS9nU R                  UR                  SSUR                  4/5        UR                  5         U R                  UR                  5        g)z
If L{ConnectionPool.close} is called after it has been started, but
not by its shutdown trigger, the shutdown trigger is cancelled.
Tr@  rA  duringshutdownN)r  r   r   r  
finalCloser'   r  rD  s      r   test_startedClose%ConnectionPoolTests.test_startedCloseZ  s\    
 t$8WM))Xz4??,S+TU

))*r!   r_   N)r   r   r   r   r   r!  r*  r=  rE  rK  r   r_   r!   r   r  r    s!    :> !F++r!   r  ))r   r  r  typingr   r   twisted.enterprise.adbapir   r   r   r   twisted.internetr	   r
   r   twisted.python.failurer   twisted.python.reflectr   twisted.trialr   rF   r   r   r  r;  rQ  r[  rm  rv  r  r  r  r  r  r  r  r  r  r  r  r_   r!   r   <module>rS     s0   
  !  8 7 * 0 " Y YxM M`>$ >$B 4 4 8 8_ 61 1hH ^]GI 6  0') < 6>h'' >.>x(( ><" " .  % %<m+(++ m+r!   