U
    Â“«jße  ã                   @   sš  d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZ ddlmZ d	ZG d
d„ dƒZG dd„ dƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Zeede ƒ ƒ eede ƒ ƒ G d d!„ d!ƒZ!G d"d#„ d#ej"ƒZ#G d$d%„ d%ej"ƒZ$G d&d'„ d'ƒZ%G d(d)„ d)e	ƒZ&G d*d+„ d+ƒZ'G d,d-„ d-ej"ƒZ(dS ).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                   @   sô   e Zd ZU dZi Zeeef ed< e	 
ed¡dkr6dZdd„ Zdd„ Zd	d
„ Zd3dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Z d-d.„ Z!d/d0„ Z"d1d2„ Z#dS )4ÚADBAPITestBasez,
    Test the asynchronous DB-API code.
    Úopenfun_calledNú5ADB-API requires threads, no way to test without themc                 C   s&   |   ¡  | j| jd�| _| j ¡  dS )zR
        Set up the database and create a connection pool pointing at it.
        )Z
cp_openfunN)ÚstartDBÚmakePoolÚopenfunÚdbpoolÚstart©Úself© r   ú</tmp/pip-unpacked-wheel-59kc99xd/twisted/test/test_adbapi.pyÚ
extraSetUp(   s    zADBAPITestBase.extraSetUpc                    s4   ˆ j  d¡}| ‡ fdd„¡ | ‡ fdd„¡ |S )NúDROP TABLE simplec                    s
   ˆ j  ¡ S ©N©r   Úclose©Úresr   r   r   Ú<lambda>2   ó    z)ADBAPITestBase.tearDown.<locals>.<lambda>c                    s   ˆ   ¡ S r   ©ÚstopDBr    r   r   r   r"   3   r#   ©r   ÚrunOperationÚaddCallback©r   Údr   r   r   ÚtearDown0   s    zADBAPITestBase.tearDownc                 C   s   d| j |< d S )NT)r   ©r   Úconnr   r   r   r   6   s    zADBAPITestBase.openfunc                 C   s$   |s|   | j¡ n|  || j¡ d S r   )Ú
assertTruer   ZassertInr,   r   r   r   ÚcheckOpenfunCalled9   s    z!ADBAPITestBase.checkOpenfunCalledc                    s¸   ˆ j  t¡}ˆ jrT| ˆ j¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ | ‡ fdd„¡ | ˆ j	¡ | ˆ j
¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ |S )Nc                    s   ˆ   ¡ S r   )ÚflushLoggedErrorsr    r   r   r   r"   F   r#   z*ADBAPITestBase.test_pool.<locals>.<lambda>)r   r'   Úsimple_table_schemaÚtest_failuresr(   Ú_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_9r)   r   r   r   Ú	test_pool?   s     zADBAPITestBase.test_poolc                    s,   t  ˆ jjd¡}| ‡ fdd„dd„ ¡ |S )Núselect * from NOTABLEc                    s
   ˆ   d¡S ©Nzno exception©Zfailr    r   r   r   r"   S   r#   z.ADBAPITestBase._testPool_1_1.<locals>.<lambda>c                 S   s   d S r   r   ©Úfr   r   r   r"   S   r#   ©r   ÚmaybeDeferredr   ÚrunQueryÚaddCallbacks©r   r!   r*   r   r   r   r3   Q   s    zADBAPITestBase._testPool_1_1c                    s,   t  ˆ jjd¡}| ‡ fdd„dd„ ¡ |S )Nzdeletexxx from NOTABLEc                    s
   ˆ   d¡S rA   rB   r    r   r   r   r"   X   r#   z.ADBAPITestBase._testPool_1_2.<locals>.<lambda>c                 S   s   d S r   r   rC   r   r   r   r"   X   r#   )r   rF   r   r'   rH   rI   r   r   r   r4   V   s    zADBAPITestBase._testPool_1_2c                    s.   t  ˆ jjˆ j¡}| ‡ fdd„dd„ ¡ |S )Nc                    s
   ˆ   d¡S rA   rB   r    r   r   r   r"   ]   r#   z.ADBAPITestBase._testPool_1_3.<locals>.<lambda>c                 S   s   d S r   r   rC   r   r   r   r"   ]   r#   )r   rF   r   ÚrunInteractionÚbad_interactionrH   rI   r   r   r   r5   [   s    zADBAPITestBase._testPool_1_3c                    s.   t  ˆ jjˆ j¡}| ‡ fdd„dd„ ¡ |S )Nc                    s
   ˆ   d¡S rA   rB   r    r   r   r   r"   b   r#   z.ADBAPITestBase._testPool_1_4.<locals>.<lambda>c                 S   s   d S r   r   rC   r   r   r   r"   b   r#   )r   rF   r   ÚrunWithConnectionÚbad_withConnectionrH   rI   r   r   r   r6   `   s    zADBAPITestBase._testPool_1_4c                    s*   d}ˆ j  |¡}‡ fdd„}| |¡ |S )Núselect count(1) from simplec                    s(   ˆ   t| d d ƒdkd¡ ˆ  ¡  d S )Nr   zInteraction not rolled back)r.   Úintr/   ©Úrowr   r   r   Ú_checkj   s    z*ADBAPITestBase._testPool_2.<locals>._check©r   rG   r(   ©r   r!   Úsqlr*   rR   r   r   r   r7   e   s
    
zADBAPITestBase._testPool_2c                    sl   d}g }t ˆ jƒD ]}d| }| ˆ j |¡¡ qt |¡}‡ fdd„}| |¡ ‡ fdd„}| |¡ |S )NrN   z insert into simple(x) values(%d)c                    s   d}ˆ j  |¡}|S )Núselect x from simple order by x)r   rG   )r!   rU   r*   r   r   r   Ú_selectz   s    z+ADBAPITestBase._testPool_3.<locals>._selectc                    sZ   ˆ   t| ƒˆ jkd¡ tˆ jƒD ]4}ˆ   t| | ƒdkd¡ ˆ   | | d |kd¡ q d S )NzWrong number of rowsé   úWrong size rowr   zValues not returned.)r.   ÚlenÚnum_iterationsÚrange)ZrowsÚir   r   r   rR   ‚   s    z*ADBAPITestBase._testPool_3.<locals>._check)r\   r[   Úappendr   r'   r   ZgatherResultsr(   )r   r!   rU   Úinsertsr]   r*   rW   rR   r   r   r   r8   q   s    


zADBAPITestBase._testPool_3c                    s$   ˆ j  ˆ j¡}| ‡ fdd„¡ |S )Nc                    s   ˆ   | d¡S ©NÚdone©ÚassertEqualr    r   r   r   r"   �   r#   z,ADBAPITestBase._testPool_4.<locals>.<lambda>)r   rJ   Úinteractionr(   rI   r   r   r   r9   Œ   s    zADBAPITestBase._testPool_4c                    s$   ˆ j  ˆ j¡}| ‡ fdd„¡ |S )Nc                    s   ˆ   | d¡S r`   rb   r    r   r   r   r"   •   r#   z,ADBAPITestBase._testPool_5.<locals>.<lambda>)r   rL   ÚwithConnectionr(   rI   r   r   r   r:   ’   s    zADBAPITestBase._testPool_5c                 C   s   | j  | j¡}|S r   )r   rL   Úclose_withConnectionrI   r   r   r   r;   ˜   s    zADBAPITestBase._testPool_6c                    sV   g }t ˆ jƒD ]}d| }| ˆ j |¡¡ qtj|dd�}‡ fdd„}| |¡ |S )Nz!select x from simple where x = %dT©ZfireOnOneErrbackc                    s4   t ˆ jƒD ]$}ˆ  | | d d d |kd¡ q
d S )NrX   r   zValue not returned)r\   r[   r.   )Úresultr]   r   r   r   rR   ¥   s    z*ADBAPITestBase._testPool_7.<locals>._check)r\   r[   r^   r   rG   r   ÚDeferredListr(   )r   r!   Údsr]   rU   ÚdlistrR   r   r   r   r<   �   s    
zADBAPITestBase._testPool_7c                 C   s@   g }t | jƒD ]}d| }| | j |¡¡ qtj|dd�}|S )Nzdelete from simple where x = %dTrg   )r\   r[   r^   r   r'   r   ri   )r   r!   rj   r]   rU   rk   r   r   r   r=   ¬   s    zADBAPITestBase._testPool_8c                    s*   d}ˆ j  |¡}‡ fdd„}| |¡ |S )NrN   c                    s(   ˆ   t| d d ƒdkd¡ ˆ  ¡  d S )Nr   z)Didn't successfully delete table contents)r.   rO   ÚcheckConnectrP   r   r   r   rR   º   s
     ÿz*ADBAPITestBase._testPool_9.<locals>._checkrS   rT   r   r   r   r>   µ   s
    
zADBAPITestBase._testPool_9c                 C   s°   | j  ¡ }|  |¡ | ¡ }| d¡ | d¡ | ¡ }|  t|ƒd¡ |  t|d ƒd¡ |  |d d d¡ | d¡ | d¡ |  t| ¡ ƒd¡ | ¡  | j  	|¡ dS )z/Check the connect/disconnect synchronous calls.zinsert into simple(x) values(1)zselect x from simplerX   r   zdelete from simpleN)
r   Úconnectr/   ÚcursorÚexecuteZfetchallrc   rZ   r   Ú
disconnect)r   r-   Úcursr!   r   r   r   rl   Ã   s    





zADBAPITestBase.checkConnectc                 C   s^   |  d¡ t| jƒD ]4}| ¡ }|  t|ƒdkd¡ |  |d |kd¡ q|  | ¡ d¡ dS )NrV   rX   rY   r   úValue not returned.zToo many rowsra   )ro   r\   r[   Úfetchoner.   rZ   ZassertIsNone)r   Útransactionr]   rQ   r   r   r   rd   Ô   s    
zADBAPITestBase.interactionc                 C   s   | j r| d¡ | d¡ d S )Nzinsert into simple(x) values(0)r@   )Úcan_rollbackro   )r   rt   r   r   r   rK   Ý   s    
zADBAPITestBase.bad_interactionc                 C   sf   |  ¡ }zN| d¡ t| jƒD ]4}| ¡ }|  t|ƒdkd¡ |  |d |kd¡ qW 5 | ¡  X dS )NrV   rX   rY   r   rr   ra   )rn   r   ro   r\   r[   rs   r.   rZ   )r   r-   rq   r]   rQ   r   r   r   re   ã   s    

zADBAPITestBase.withConnectionc                 C   s   |  ¡  d S r   )r   r,   r   r   r   rf   ï   s    z#ADBAPITestBase.close_withConnectionc                 C   s&   |  ¡ }z| d¡ W 5 | ¡  X d S )Nr@   )rn   r   ro   )r   r-   rq   r   r   r   rM   ò   s    z!ADBAPITestBase.bad_withConnection)N)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚobjectÚboolÚ__annotations__r	   ÚIReactorThreadsr
   Úskipr   r+   r   r/   r?   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   rl   rd   rK   re   rf   rM   r   r   r   r   r      s6   

		r   c                   @   sd   e Zd ZdZe ed¡dkr dZdd„ Zdd„ Z	dd	„ Z
d
d„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚReconnectTestBasez;
    Test the asynchronous DB-API code with reconnect.
    Nr   c                 C   sF   | j dkrt d¡‚|  ¡  | jdd| j d�| _| j ¡  | j t¡S )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.
        Nzno good sql for reconnect testrX   T)Úcp_maxZcp_reconnectZcp_good_sql)	Úgood_sqlr   ÚSkipTestr   r   r   r   r'   r1   r   r   r   r   r     s    

  ÿ
zReconnectTestBase.extraSetUpc                    s4   ˆ j  d¡}| ‡ fdd„¡ | ‡ fdd„¡ |S )Nr   c                    s
   ˆ j  ¡ S r   r   r    r   r   r   r"     r#   z,ReconnectTestBase.tearDown.<locals>.<lambda>c                    s   ˆ   ¡ S r   r$   r    r   r   r   r"     r#   r&   r)   r   r   r   r+     s    zReconnectTestBase.tearDownc                 C   sP   t  d ¡}| | j¡ | | j¡ | js4| | j¡ | | j¡ | | j¡ |S r   )	r   Zsucceedr(   Ú_testPool_1r7   Úearly_reconnectr8   r9   r:   r)   r   r   r   r?     s    
zReconnectTestBase.test_poolc                    s*   d}ˆ j  |¡}‡ fdd„}| |¡ |S )NrN   c                    s    ˆ   t| d d ƒdkd¡ d S ©Nr   zTable not empty©r.   rO   rP   r   r   r   rR   %  s    z-ReconnectTestBase._testPool_1.<locals>._checkrS   rT   r   r   r   rƒ   !  s
    
zReconnectTestBase._testPool_1c                 C   s   t | jj ¡ ƒd  ¡  d S )Nr   )Úlistr   ÚconnectionsÚvaluesr   )r   r!   r   r   r   r7   +  s    zReconnectTestBase._testPool_2c                    s0   d}t  ˆ jj|¡}| ‡ fdd„dd„ ¡ |S )NrN   c                    s
   ˆ   d¡S rA   rB   r    r   r   r   r"   2  r#   z/ReconnectTestBase._testPool_3.<locals>.<lambda>c                 S   s   d S r   r   rC   r   r   r   r"   2  r#   rE   ©r   r!   rU   r*   r   r   r   r8   /  s    zReconnectTestBase._testPool_3c                    s*   d}ˆ j  |¡}‡ fdd„}| |¡ |S )NrN   c                    s    ˆ   t| d d ƒdkd¡ d S r…   r†   rP   r   r   r   rR   9  s    z-ReconnectTestBase._testPool_4.<locals>._checkrS   rT   r   r   r   r9   5  s
    
zReconnectTestBase._testPool_4c                    s<   ˆ   ¡  d}t ˆ jj|¡}| ‡ fdd„‡ fdd„¡ |S )Nr@   c                    s
   ˆ   d¡S rA   rB   r    r   r   r   r"   D  r#   z/ReconnectTestBase._testPool_5.<locals>.<lambda>c                    s   ˆ   |  t¡¡S r   )ÚassertFalseÚcheckr   rC   r   r   r   r"   E  r#   )r0   r   rF   r   rG   rH   rŠ   r   r   r   r:   ?  s    

þzReconnectTestBase._testPool_5)rv   rw   rx   ry   r	   r}   r
   r~   r   r+   r?   rƒ   r7   r8   r9   r:   r   r   r   r   r   ú   s   


r   c                   @   s”   e Zd ZU dZdZee ed< dZdZ	dZ
dZdZdZdZdZdZejZee ed< dZdZdZdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚDBTestConnectora>  
    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_PREFIXZtwisted_testTr�   é2   c                 C   s6   |   ¡ | _t | j¡ |  ¡ s.t d| j ¡‚|  ¡ S )Nz%s: Cannot access db)	ÚmktempÚDB_DIRÚosÚmkdirÚcan_connectr   r‚   rŽ   r   r   r   r   r   ÚsetUpi  s
    
zDBTestConnector.setUpc                 C   s
   t ƒ ‚dS )zXReturn true if this database is present on the system
        and can be used in a test.N©ÚNotImplementedErrorr   r   r   r   r”   p  s    zDBTestConnector.can_connectc                 C   s   dS )z+Take any steps needed to bring database up.Nr   r   r   r   r   r   u  s    zDBTestConnector.startDBc                 C   s   dS )zBring database down, if needed.Nr   r   r   r   r   r%   y  s    zDBTestConnector.stopDBc                 K   s(   |   ¡ \}}| ¡ }| |¡ t||ŽS )z;Create a connection pool with additional keyword arguments.)ÚgetPoolArgsÚcopyÚupdater   )r   ZnewkwÚargsÚkwr   r   r   r   }  s    
zDBTestConnector.makePoolc                 C   s
   t ƒ ‚dS )z™Return a tuple (args, kw) of list and keyword arguments
        that need to be passed to ConnectionPool to create a connection
        to this database.Nr–   r   r   r   r   r˜   „  s    zDBTestConnector.getPoolArgs)rv   rw   rx   ry   rŽ   r   Ústrr|   ÚDB_NAMEÚDB_USERÚDB_PASSr‘   Znulls_okÚtrailing_spaces_okru   r2   Úescape_slashesr   r�   r„   Ú	can_clearr[   r•   r”   r   r%   r   r˜   r   r   r   r   r�   J  s*   

r�   c                   @   s4   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	dS )ÚSQLite3ConnectorzB
    Connector that uses the stdlib SQLite3 database support.
    ZSQLite3FrX   c                 C   s   t dƒd krdS dS d S )NÚsqlite3FTr   r   r   r   r   r”   ”  s    zSQLite3Connector.can_connectc                 C   s2   t j | j| j¡| _t j | j¡r.t  | j¡ d S r   ©r’   ÚpathÚjoinr‘   rž   ÚdatabaseÚexistsÚunlinkr   r   r   r   r   š  s    zSQLite3Connector.startDBc                 C   s   d}| j dddœ}||fS )N)r¥   rX   F©r©   r€   Zcheck_same_thread©r©   ©r   r›   rœ   r   r   r   r˜   Ÿ  s    zSQLite3Connector.getPoolArgsN©
rv   rw   rx   ry   rŽ   r¢   r[   r”   r   r˜   r   r   r   r   r¤   ‹  s   r¤   c                   @   s4   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	dS )ÚPySQLite2ConnectorzA
    Connector that uses pysqlite's SQLite database support.
    Z	pysqlite2FrX   c                 C   s   t dƒd krdS dS d S )Núpysqlite2.dbapi2FTr   r   r   r   r   r”   ®  s    zPySQLite2Connector.can_connectc                 C   s2   t j | j| j¡| _t j | j¡r.t  | j¡ d S r   r¦   r   r   r   r   r   ´  s    zPySQLite2Connector.startDBc                 C   s   d}| j dddœ}||fS )N)r±   rX   Fr¬   r­   r®   r   r   r   r˜   ¹  s    zPySQLite2Connector.getPoolArgsNr¯   r   r   r   r   r°   ¥  s   r°   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚPyPgSQLConnectorZPyPgSQLc                 C   sh   zddl m} W n tk
r&   Y dS X z$|j| j| j| jd�}| ¡  W dS  tk
rb   Y dS X d S )Nr   )ÚPgSQLF©r©   ÚuserÚpasswordT)ZpyPgSQLr³   ÚBaseExceptionrm   rž   rŸ   r    r   )r   r³   r-   r   r   r   r”   Â  s      ÿzPyPgSQLConnector.can_connectc                 C   s    d}| j | j| jddœ}||fS )N)zpyPgSQL.PgSQLr   ©r©   rµ   r¶   Zcp_min©rž   rŸ   r    r®   r   r   r   r˜   Ð  s    üzPyPgSQLConnector.getPoolArgsN©rv   rw   rx   rŽ   r”   r˜   r   r   r   r   r²   ¿  s   r²   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚPsycopgConnectorZPsycopgc                 C   sd   zdd l }W n tk
r"   Y dS X z$|j| j| j| jd�}| ¡  W dS  tk
r^   Y dS X d S )Nr   Fr´   T)Úpsycopgr·   rm   rž   rŸ   r    r   )r   r¼   r-   r   r   r   r”   Þ  s      ÿzPsycopgConnector.can_connectc                 C   s    d}| j | j| jddœ}||fS )N)r¼   r   r¸   r¹   r®   r   r   r   r˜   ì  s    üzPsycopgConnector.getPoolArgsNrº   r   r   r   r   r»   Û  s   r»   c                   @   s,   e Zd ZdZdZdZdZdd„ Zdd„ ZdS )ÚMySQLConnectorZMySQLFc                 C   sd   zdd l }W n tk
r"   Y dS X z$|j| j| j| jd�}| ¡  W dS  tk
r^   Y dS X d S )Nr   F©Údbrµ   ÚpasswdT)ÚMySQLdbr·   rm   rž   rŸ   r    r   )r   rÁ   r-   r   r   r   r”   þ  s      ÿzMySQLConnector.can_connectc                 C   s   d}| j | j| jdœ}||fS )N)rÁ   r¾   r¹   r®   r   r   r   r˜     s    zMySQLConnector.getPoolArgsN)	rv   rw   rx   rŽ   r¡   ru   r„   r”   r˜   r   r   r   r   r½   ÷  s   r½   c                   @   sD   e Zd ZdZdZdZdZdZdZdd„ Z	dd„ Z
d	d
„ Zdd„ ZdS )ÚFirebirdConnectorZFirebirdFNé   c                 C   sB   t dƒd krdS z|  ¡  |  ¡  W dS  tk
r<   Y dS X d S )NÚkinterbasdbFT)r   r   r%   r·   r   r   r   r   r”     s    zFirebirdConnector.can_connectc                 C   sf   dd l }tj | jtj¡| _t | jtj	tj
 tj ¡ d}|| j| j| jf; }| |¡}| ¡  d S )Nr   z,create database "%s" user "%s" password "%s")rÄ   r’   r§   r¨   r‘   r�   rž   ÚchmodÚstatÚS_IRWXUÚS_IRWXGÚS_IRWXOrŸ   r    Zcreate_databaser   )r   rÄ   rU   r-   r   r   r   r   &  s    
zFirebirdConnector.startDBc                 C   s    d}| j d| j| jdœ}||fS )N)rÄ   ú	127.0.0.1©r©   Úhostrµ   r¶   r¹   r®   r   r   r   r˜   0  s    üzFirebirdConnector.getPoolArgsc                 C   s,   dd l }|j| jd| j| jd�}| ¡  d S )Nr   rÊ   rË   )rÄ   rm   rž   rŸ   r    Zdrop_database)r   rÄ   r-   r   r   r   r%   :  s    üzFirebirdConnector.stopDB)rv   rw   rx   rŽ   r2   r¢   r�   r£   r[   r”   r   r˜   r%   r   r   r   r   rÂ     s   


rÂ   c                    sˆ   t tttttg}i }|D ]`‰ ˆ j| }G ‡ fdd„dˆ | tjƒ}||_	t
ˆ dƒrpd ˆ j ¡ dd… |g ¡|_|||< q| |¡ dS )aQ  
    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                       s   e Zd Z” jZdS )zmakeSQLTests.<locals>.testcaseN)rv   rw   rx   r   ©Z	connclassr   r   Útestcase[  s   rÎ   rx   Ú.r   éÿÿÿÿN)r°   r¤   r²   r»   r½   rÂ   rŽ   r   ÚTestCaserv   Úhasattrr¨   rx   Úsplitrš   )ÚbaseÚsuffixÚglobalsZ
connectorsÚtestsÚnamerÎ   r   rÍ   r   ÚmakeSQLTestsF  s$    
ú

ÿ
rÙ   ZADBAPITestsZReconnectTestsc                   @   s0   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚFakePoolz¿
    A fake L{ConnectionPool} for tests.

    @ivar connectionFactory: factory for making connections returned by the
        C{connect} method.
    @type connectionFactory: any callable
    Tc                 C   s
   || _ d S r   ©ÚconnectionFactory)r   rÜ   r   r   r   Ú__init__}  s    zFakePool.__init__c                 C   s   |   ¡ S )zB
        Return an instance of C{self.connectionFactory}.
        rÛ   r   r   r   r   rm   €  s    zFakePool.connectc                 C   s   dS )z
        Do nothing.
        Nr   )r   Ú
connectionr   r   r   rp   †  s    zFakePool.disconnectN)	rv   rw   rx   ry   Ú	reconnectZnoisyrÝ   rm   rp   r   r   r   r   rÚ   q  s   rÚ   c                   @   s   e Zd ZdZdd„ ZdS )ÚConnectionTestsz,
    Tests for the L{Connection} class.
    c                 C   sb   G dd„ dƒ}t |ƒ}t|ƒ}|  t|j¡ |  t¡}|  t|ƒd¡ |  |d j	j
d d¡ dS )z|
        If an error happens during rollback, L{ConnectionLost} is raised but
        the original error is logged.
        c                   @   s   e Zd Zdd„ ZdS )zIConnectionTests.test_rollbackErrorLogged.<locals>.ConnectionRollbackRaisec                 S   s   t dƒ‚d S ©Núproblem!©ÚRuntimeErrorr   r   r   r   Úrollback˜  s    zRConnectionTests.test_rollbackErrorLogged.<locals>.ConnectionRollbackRaise.rollbackN)rv   rw   rx   rå   r   r   r   r   ÚConnectionRollbackRaise—  s   ræ   rX   r   râ   N)rÚ   r   ÚassertRaisesr   rå   r0   rä   rc   rZ   Úvaluer›   )r   ræ   ÚpoolrÞ   Úerrorsr   r   r   Útest_rollbackErrorLogged‘  s    
z(ConnectionTests.test_rollbackErrorLoggedN)rv   rw   rx   ry   rë   r   r   r   r   rà   Œ  s   rà   c                   @   s   e Zd ZdZdd„ ZdS )ÚTransactionTestsz-
    Tests for the L{Transaction} class.
    c                 C   s`   G dd„ dƒ}t dƒ}t||ƒ ƒ}| ¡  |  t¡}|  t|ƒd¡ |  |d jjd d¡ dS )z„
        If the cursor creation raises an error in L{Transaction.reopen}, it
        reconnects but log the error occurred.
        c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )zNTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaiser   c                 S   s   d S r   r   r   r   r   r   rß   ±  s    zXTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaise.reconnectc                 S   s$   | j dkr |  j d7  _ tdƒ‚d S )Nr   rX   râ   )Úcounträ   r   r   r   r   rn   ´  s    
zUTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaise.cursorN)rv   rw   rx   rí   rß   rn   r   r   r   r   ÚConnectionCursorRaise®  s   rî   NrX   r   râ   )	rÚ   r   Zreopenr0   rä   rc   rZ   rè   r›   )r   rî   ré   rt   rê   r   r   r   Útest_reopenLogErrorIfReconnect¨  s    
z/TransactionTests.test_reopenLogErrorIfReconnectN)rv   rw   rx   ry   rï   r   r   r   r   rì   £  s   rì   c                   @   s   e Zd Zdd„ ZdS )ÚNonThreadPoolc                 O   s@   d}z|||Ž}W n t k
r0   d}tƒ }Y nX |||ƒ d S )NTF)Ú	Exceptionr   )r   ZonResultrD   Úarœ   Úsuccessrh   r   r   r   ÚcallInThreadWithCallbackÂ  s    z&NonThreadPool.callInThreadWithCallbackN)rv   rw   rx   rô   r   r   r   r   rð   Á  s   rð   c                   @   s   e Zd ZdZeƒ Zdd„ ZdS )ÚDummyConnectionPoolz'
    A testable L{ConnectionPool};
    c                 C   s
   t | _dS )z*
        Don't forward init call.
        N)r
   Z_reactorr   r   r   r   rÝ   Ó  s    zDummyConnectionPool.__init__N)rv   rw   rx   ry   rð   Z
threadpoolrÝ   r   r   r   r   rõ   Ì  s   rõ   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚEventReactora  
    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                 C   s   || _ g | _d S r   )Ú_runningÚtriggers)r   Zrunningr   r   r   rÝ   å  s    zEventReactor.__init__c                 C   s    | j r|ƒ  n|  dd|¡S d S )NÚafterÚstartup)r÷   ÚaddSystemEventTrigger)r   Úfunctionr   r   r   ÚcallWhenRunningé  s    zEventReactor.callWhenRunningc                 C   s   |||f}| j  |¡ |S r   )rø   r^   )r   ÚphaseÚeventZtriggerÚhandler   r   r   rû   ï  s    
z"EventReactor.addSystemEventTriggerc                 C   s   | j  |¡ d S r   )rø   Úremove)r   r   r   r   r   ÚremoveSystemEventTriggerô  s    z%EventReactor.removeSystemEventTriggerN)rv   rw   rx   ry   rÝ   rý   rû   r  r   r   r   r   rö   Ú  s
   
rö   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚConnectionPoolTestsz+
    Unit tests for L{ConnectionPool}.
    c                    sR   G dd„ dƒ}dd„ }t ƒ }||_| |¡}ˆ  |t¡}‡ fdd„}| |¡ |S )z‘
        If rollback fails, L{ConnectionPool.runWithConnection} raises the
        original exception and log the error of the rollback.
        c                   @   s   e Zd Zdd„ Zdd„ ZdS )z]ConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaisec                 S   s   d S r   r   ©r   ré   r   r   r   rÝ     s    zfConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaise.__init__c                 S   s   t dƒ‚d S rá   rã   r   r   r   r   rå     s    zfConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaise.rollbackN©rv   rw   rx   rÝ   rå   r   r   r   r   ræ     s   ræ   c                 S   s   t dƒ‚d S ©NZfoo©Ú
ValueError)rÞ   r   r   r   ÚraisingFunction
  s    zUConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.raisingFunctionc                    s6   ˆ   t¡}ˆ  t|ƒd¡ ˆ  |d jjd d¡ d S ©NrX   r   râ   ©r0   rä   rc   rZ   rè   r›   ©Zignoredrê   r   r   r   ÚcbFailed  s    
zNConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.cbFailed)rõ   rÜ   rL   ÚassertFailurer  r(   )r   ræ   r	  ré   r*   r  r   r   r   Ú(test_runWithConnectionRaiseOriginalErrorý  s    

z<ConnectionPoolTests.test_runWithConnectionRaiseOriginalErrorc                 C   sV   G dd„ dƒ}t ƒ }| |ƒ ¡ |  t¡}|  t|ƒd¡ |  |d jjd d¡ dS )z;
        L{ConnectionPool._close} logs exceptions.
        c                   @   s   e Zd Zdd„ ZdS )zDConnectionPoolTests.test_closeLogError.<locals>.ConnectionCloseRaisec                 S   s   t dƒ‚d S rá   rã   r   r   r   r   r      s    zJConnectionPoolTests.test_closeLogError.<locals>.ConnectionCloseRaise.closeN)rv   rw   rx   r   r   r   r   r   ÚConnectionCloseRaise  s   r  rX   r   râ   N)rõ   Ú_closer0   rä   rc   rZ   rè   r›   )r   r  ré   rê   r   r   r   Útest_closeLogError  s    
z&ConnectionPoolTests.test_closeLogErrorc                    sf   G dd„ dƒ}G dd„ dƒ}dd„ }t ƒ }||_||_| |¡}ˆ  |t¡}‡ fdd„}| |¡ |S )	zŽ
        If rollback fails, L{ConnectionPool.runInteraction} raises the
        original exception and log the error of the rollback.
        c                   @   s   e Zd Zdd„ Zdd„ ZdS )z^ConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaisec                 S   s   d S r   r   r  r   r   r   rÝ   1  s    zgConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaise.__init__c                 S   s   t dƒ‚d S rá   rã   r   r   r   r   rå   4  s    zgConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaise.rollbackNr  r   r   r   r   ræ   0  s   ræ   c                   @   s   e Zd Zdd„ ZdS )zWConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.DummyTransactionc                 S   s   d S r   r   )r   ré   rÞ   r   r   r   rÝ   8  s    z`ConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.DummyTransaction.__init__N)rv   rw   rx   rÝ   r   r   r   r   ÚDummyTransaction7  s   r  c                 S   s   t dƒ‚d S r  r  )rt   r   r   r   r	  ;  s    zVConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.raisingFunctionc                    s6   ˆ   t¡}ˆ  t|ƒd¡ ˆ  |d jjd d¡ d S r
  r  r  r   r   r   r  E  s    
zOConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.cbFailed)rõ   rÜ   ZtransactionFactoryrJ   r  r  r(   )r   ræ   r  r	  ré   r*   r  r   r   r   Ú)test_runWithInteractionRaiseOriginalError*  s    

z=ConnectionPoolTests.test_runWithInteractionRaiseOriginalErrorc                 C   sD   t dƒ}td|d�}|  |jdd|jfg¡ | ¡  |  |j¡ dS )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©Z
cp_reactorrù   rú   N)rö   r   rc   rø   Ú_startr   r‹   ©r   r
   ré   r   r   r   Útest_unstartedCloseM  s
    z'ConnectionPoolTests.test_unstartedClosec                 C   sD   t dƒ}td|d�}|  |jdd|jfg¡ | ¡  |  |j¡ dS )z�
        If L{ConnectionPool.close} is called after it has been started, but
        not by its shutdown trigger, the shutdown trigger is cancelled.
        Tr  r  ZduringÚshutdownN)rö   r   rc   rø   Z
finalCloser   r‹   r  r   r   r   Útest_startedCloseZ  s
    z%ConnectionPoolTests.test_startedCloseN)	rv   rw   rx   ry   r  r  r  r  r  r   r   r   r   r  ø  s   #r  ))ry   r’   rÆ   Útypingr   r   Ztwisted.enterprise.adbapir   r   r   r   Ztwisted.internetr   r	   r
   Ztwisted.python.failurer   Ztwisted.python.reflectr   Ztwisted.trialr   r1   r   r   r�   r¤   r°   r²   r»   r½   rÂ   rÙ   rÖ   rÚ   rÑ   rà   rì   rð   rõ   rö   r  r   r   r   r   Ú<module>   s:    ]PA4$