o
    Óó·iß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u rd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   ú^C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/test/test_adbapi.pyÚ
extraSetUp(   s   zADBAPITestBase.extraSetUpc                    ó4   ˆ j  d¡}| ‡ fdd„¡ | ‡ fdd„¡ |S )NúDROP TABLE simplec                    ó
   ˆ j  ¡ S ©N©r   Úclose©Úresr   r   r   Ú<lambda>2   ó   
 z)ADBAPITestBase.tearDown.<locals>.<lambda>c                    ó   ˆ   ¡ S r   ©ÚstopDBr"   r   r   r   r$   3   ó    ©r   ÚrunOperationÚaddCallback©r   Údr   r   r   ÚtearDown0   ó   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¡ d S |  || j¡ d S r   )Ú
assertTruer   ZassertInr1   r   r   r   ÚcheckOpenfunCalled9   s   z!ADBAPITestBase.checkOpenfunCalledc                    s¸   ˆ j  t¡}ˆ jr*| ˆ j¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ | ‡ fdd„¡ | ˆ j	¡ | ˆ j
¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ | ˆ j¡ |S )Nc                    r&   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                    ó,   t  ˆ jjd¡}| ‡ fdd„dd„ ¡ |S )Núselect * from NOTABLEc                    ó
   ˆ   d¡S ©Nzno exception©Zfailr"   r   r   r   r$   S   r%   z.ADBAPITestBase._testPool_1_1.<locals>.<lambda>c                 S   ó   d S r   r   ©Úfr   r   r   r$   S   ó    ©r   ÚmaybeDeferredr   ÚrunQueryÚaddCallbacks©r   r#   r.   r   r   r   r8   Q   ó   zADBAPITestBase._testPool_1_1c                    rE   )Nzdeletexxx from NOTABLEc                    rG   rH   rI   r"   r   r   r   r$   X   r%   z.ADBAPITestBase._testPool_1_2.<locals>.<lambda>c                 S   rJ   r   r   rK   r   r   r   r$   X   rM   )r   rO   r   r+   rQ   rR   r   r   r   r9   V   rS   zADBAPITestBase._testPool_1_2c                    ó.   t  ˆ jjˆ j¡}| ‡ fdd„dd„ ¡ |S )Nc                    rG   rH   rI   r"   r   r   r   r$   ]   r%   z.ADBAPITestBase._testPool_1_3.<locals>.<lambda>c                 S   rJ   r   r   rK   r   r   r   r$   ]   rM   )r   rO   r   ÚrunInteractionÚbad_interactionrQ   rR   r   r   r   r:   [   ó   zADBAPITestBase._testPool_1_3c                    rT   )Nc                    rG   rH   rI   r"   r   r   r   r$   b   r%   z.ADBAPITestBase._testPool_1_4.<locals>.<lambda>c                 S   rJ   r   r   rK   r   r   r   r$   b   rM   )r   rO   r   ÚrunWithConnectionÚbad_withConnectionrQ   rR   r   r   r   r;   `   rW   zADBAPITestBase._testPool_1_4c                    ó*   d}ˆ j  |¡}‡ fdd„}| |¡ |S )Núselect count(1) from simplec                    ó(   ˆ   t| d d ƒdkd¡ ˆ  ¡  d S )Nr   zInteraction not rolled back)r3   Úintr4   ©Úrowr   r   r   Ú_checkj   s   z*ADBAPITestBase._testPool_2.<locals>._check©r   rP   r,   ©r   r#   Úsqlr.   r`   r   r   r   r<   e   s
   
zADBAPITestBase._testPool_2c                    sl   d}g }t ˆ jƒD ]}d| }| ˆ j |¡¡ q	t |¡}‡ fdd„}| |¡ ‡ fdd„}| |¡ |S )Nr[   z insert into simple(x) values(%d)c                    s   d}ˆ j  |¡}|S )Núselect x from simple order by x)r   rP   )r#   rc   r.   r   r   r   Ú_selectz   s   z+ADBAPITestBase._testPool_3.<locals>._selectc                    sZ   ˆ   t| ƒˆ jkd¡ tˆ jƒD ]}ˆ   t| | ƒdkd¡ ˆ   | | d |kd¡ qd S )NzWrong number of rowsé   úWrong size rowr   zValues not returned.)r3   ÚlenÚnum_iterationsÚrange)ÚrowsÚir   r   r   r`   ‚   s
   þz*ADBAPITestBase._testPool_3.<locals>._check)rj   ri   Úappendr   r+   r   ZgatherResultsr,   )r   r#   rc   Zinsertsrl   r.   re   r`   r   r   r   r=   q   s   


zADBAPITestBase._testPool_3c                    ó$   ˆ j  ˆ j¡}| ‡ fdd„¡ |S )Nc                    ó   ˆ   | d¡S ©NÚdone©ÚassertEqualr"   r   r   r   r$   �   ó    z,ADBAPITestBase._testPool_4.<locals>.<lambda>)r   rU   Úinteractionr,   rR   r   r   r   r>   Œ   ó   zADBAPITestBase._testPool_4c                    rn   )Nc                    ro   rp   rr   r"   r   r   r   r$   •   rt   z,ADBAPITestBase._testPool_5.<locals>.<lambda>)r   rX   ÚwithConnectionr,   rR   r   r   r   r?   ’   rv   zADBAPITestBase._testPool_5c                 C   s   | j  | j¡}|S r   )r   rX   Úclose_withConnectionrR   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 )Nrf   r   zValue not returned)rj   ri   r3   )Úresultrl   r   r   r   r`   ¥   s   "ÿz*ADBAPITestBase._testPool_7.<locals>._check)rj   ri   rm   r   rP   r   ÚDeferredListr,   )r   r#   Údsrl   rc   Údlistr`   r   r   r   rA   �   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 = %dTry   )rj   ri   rm   r   r+   r   r{   )r   r#   r|   rl   rc   r}   r   r   r   rB   ¬   s   zADBAPITestBase._testPool_8c                    rZ   )Nr[   c                    r\   )Nr   z)Didn't successfully delete table contents)r3   r]   ÚcheckConnectr^   r   r   r   r`   º   s   ÿz*ADBAPITestBase._testPool_9.<locals>._checkra   rb   r   r   r   rC   µ   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 simplerf   r   zdelete from simpleN)
r   Úconnectr4   ÚcursorÚexecuteZfetchallrs   rh   r!   Ú
disconnect)r   r2   Úcursr#   r   r   r   r~   Ã   s   





zADBAPITestBase.checkConnectc                 C   s^   |  d¡ t| jƒD ]}| ¡ }|  t|ƒdkd¡ |  |d |kd¡ q
|  | ¡ d¡ dS )Nrd   rf   rg   r   úValue not returned.zToo many rowsrq   )r�   rj   ri   Úfetchoner3   rh   ZassertIsNone)r   Útransactionrl   r_   r   r   r   ru   Ô   s   
zADBAPITestBase.interactionc                 C   s   | j r| d¡ | d¡ d S )Nzinsert into simple(x) values(0)rF   )Úcan_rollbackr�   )r   r†   r   r   r   rV   Ý   ó   
zADBAPITestBase.bad_interactionc                 C   sl   |  ¡ }z,| d¡ t| jƒD ]}| ¡ }|  t|ƒdkd¡ |  |d |kd¡ qW | ¡  dS | ¡  w )Nrd   rf   rg   r   r„   rq   )r€   r�   rj   ri   r…   r3   rh   r!   )r   r2   rƒ   rl   r_   r   r   r   rw   ã   s   
ý
ÿzADBAPITestBase.withConnectionc                 C   s   |  ¡  d S r   )r!   r1   r   r   r   rx   ï   s   z#ADBAPITestBase.close_withConnectionc                 C   s,   |  ¡ }z| d¡ W | ¡  d S | ¡  w )NrF   )r€   r�   r!   )r   r2   rƒ   r   r   r   rY   ò   s   z!ADBAPITestBase.bad_withConnectionr   )$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚobjectÚboolÚ__annotations__r	   ÚIReactorThreadsr
   Úskipr   r/   r   r4   rD   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r~   ru   rV   rw   rx   rY   r   r   r   r   r      s8   
 
		r   c                   @   sd   e Zd ZdZe ed¡du 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u 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 testrf   T)Úcp_maxZcp_reconnectZcp_good_sql)	Úgood_sqlr   ÚSkipTestr   r   r   r   r+   r6   r   r   r   r   r     s   

ÿ
zReconnectTestBase.extraSetUpc                    r   )Nr   c                    r   r   r    r"   r   r   r   r$     r%   z,ReconnectTestBase.tearDown.<locals>.<lambda>c                    r&   r   r'   r"   r   r   r   r$     r)   r*   r-   r   r   r   r/     r0   zReconnectTestBase.tearDownc                 C   sP   t  d ¡}| | j¡ | | j¡ | js| | j¡ | | j¡ | | j¡ |S r   )	r   Zsucceedr,   Ú_testPool_1r<   Úearly_reconnectr=   r>   r?   r-   r   r   r   rD     s   
zReconnectTestBase.test_poolc                    rZ   )Nr[   c                    ó    ˆ   t| d d ƒdkd¡ d S ©Nr   zTable not empty©r3   r]   r^   r   r   r   r`   %  ó    z-ReconnectTestBase._testPool_1.<locals>._checkra   rb   r   r   r   r–   !  ó
   
zReconnectTestBase._testPool_1c                 C   s   t | jj ¡ ƒd  ¡  d S )Nr   )Úlistr   ÚconnectionsÚvaluesr!   )r   r#   r   r   r   r<   +  s   zReconnectTestBase._testPool_2c                    s0   d}t  ˆ jj|¡}| ‡ fdd„dd„ ¡ |S )Nr[   c                    rG   rH   rI   r"   r   r   r   r$   2  r%   z/ReconnectTestBase._testPool_3.<locals>.<lambda>c                 S   rJ   r   r   rK   r   r   r   r$   2  rM   rN   ©r   r#   rc   r.   r   r   r   r=   /  s   zReconnectTestBase._testPool_3c                    rZ   )Nr[   c                    r˜   r™   rš   r^   r   r   r   r`   9  r›   z-ReconnectTestBase._testPool_4.<locals>._checkra   rb   r   r   r   r>   5  rœ   zReconnectTestBase._testPool_4c                    s<   ˆ   ¡  d}t ˆ jj|¡}| ‡ fdd„‡ fdd„¡ |S )NrF   c                    rG   rH   rI   r"   r   r   r   r$   D  r%   z/ReconnectTestBase._testPool_5.<locals>.<lambda>c                    s   ˆ   |  t¡¡S r   )ÚassertFalseÚcheckr   rK   r   r   r   r$   E  s    )r5   r   rO   r   rP   rQ   r    r   r   r   r?   ?  s   

þzReconnectTestBase._testPool_5)r‰   rŠ   r‹   rŒ   r	   r�   r
   r‘   r   r/   rD   r–   r<   r=   r>   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   ó   t ƒ ‚)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   ó   dS )z+Take any steps needed to bring database up.Nr   r   r   r   r   r   u  ó   zDBTestConnector.startDBc                 C   r¯   )zBring database down, if needed.Nr   r   r   r   r   r(   y  r°   zDBTestConnector.stopDBc                 K   s,   |   ¡ \}}| ¡ }| |¡ t|i |¤ŽS )z;Create a connection pool with additional keyword arguments.N)ÚgetPoolArgsÚcopyÚupdater   )r   ZnewkwÚargsÚkwr   r   r   r   }  s   
zDBTestConnector.makePoolc                 C   r¬   )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)r‰   rŠ   r‹   rŒ   r¤   r   Ústrr�   ÚDB_NAMEÚDB_USERÚDB_PASSr§   Znulls_okÚtrailing_spaces_okr‡   r7   Úescape_slashesr   r”   r—   Ú	can_clearri   r«   rª   r   r(   r   r±   r   r   r   r   r£   J  s,   
 
r£   c                   @   ó4   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SQLite3Frf   c                 C   ó   t dƒd u rdS dS )NÚsqlite3FTr   r   r   r   r   rª   ”  ó   zSQLite3Connector.can_connectc                 C   ó6   t j | j| j¡| _t j | j¡rt  | j¡ d S d S r   ©r¨   ÚpathÚjoinr§   r·   ÚdatabaseÚexistsÚunlinkr   r   r   r   r   š  ó   ÿzSQLite3Connector.startDBc                 C   ó   d}| j dddœ}||fS )N)rÀ   rf   F©rÆ   r“   Zcheck_same_thread©rÆ   ©r   r´   rµ   r   r   r   r±   Ÿ  ó   zSQLite3Connector.getPoolArgsN©
r‰   rŠ   r‹   rŒ   r¤   r»   ri   rª   r   r±   r   r   r   r   r¾   ‹  ó    r¾   c                   @   r½   )ÚPySQLite2ConnectorzA
    Connector that uses pysqlite's SQLite database support.
    Z	pysqlite2Frf   c                 C   r¿   )Núpysqlite2.dbapi2FTr   r   r   r   r   rª   ®  rÁ   zPySQLite2Connector.can_connectc                 C   rÂ   r   rÃ   r   r   r   r   r   ´  rÉ   zPySQLite2Connector.startDBc                 C   rÊ   )N)rÒ   rf   FrË   rÌ   rÍ   r   r   r   r±   ¹  rÎ   zPySQLite2Connector.getPoolArgsNrÏ   r   r   r   r   rÑ   ¥  rÐ   rÑ   c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )ÚPyPgSQLConnectorZPyPgSQLc                 C   s`   zddl m} W n
 ty   Y dS w z|j| j| j| jd�}| ¡  W dS  ty/   Y dS w )Nr   )ÚPgSQLF©rÆ   ÚuserÚpasswordT)ZpyPgSQLrÕ   ÚBaseExceptionr   r·   r¸   r¹   r!   )r   rÕ   r2   r   r   r   rª   Â  s   ÿÿÿzPyPgSQLConnector.can_connectc                 C   ó    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±   Ð  ó   üzPyPgSQLConnector.getPoolArgsN©r‰   rŠ   r‹   r¤   rª   r±   r   r   r   r   rÔ   ¿  ó    rÔ   c                   @   rÓ   )ÚPsycopgConnectorZPsycopgc                 C   ó\   zdd l }W n
 ty   Y dS w z|j| j| j| jd�}| ¡  W dS  ty-   Y dS w )Nr   FrÖ   T)ÚpsycopgrÙ   r   r·   r¸   r¹   r!   )r   râ   r2   r   r   r   rª   Þ  ó   ÿÿÿzPsycopgConnector.can_connectc                 C   rÚ   )N)râ   r   rÛ   rÜ   rÍ   r   r   r   r±   ì  rÝ   zPsycopgConnector.getPoolArgsNrÞ   r   r   r   r   rà   Û  rß   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   rá   )Nr   F©Údbr×   ÚpasswdT)ÚMySQLdbrÙ   r   r·   r¸   r¹   r!   )r   rè   r2   r   r   r   rª   þ  rã   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)	r‰   rŠ   r‹   r¤   rº   r‡   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   s<   t dƒd u rdS z|  ¡  |  ¡  W dS  ty   Y dS w )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ë   rc   r2   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ë   r   r·   r¸   r¹   Zdrop_database)r   rë   r2   r   r   r   r(   :  s   üzFirebirdConnector.stopDB)r‰   rŠ   r‹   r¤   r7   r»   r”   r¼   ri   rª   r   r±   r(   r   r   r   r   ré     s    


ré   c                    sˆ   t tttttg}i }|D ]0‰ ˆ j| }G ‡ fdd„dˆ | tjƒ}||_	t
ˆ dƒr8d ˆ 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)r‰   rŠ   r‹   r   ©Z	connclassr   r   Útestcase[  s    
rõ   r‹   Ú.r   éÿÿÿÿN)rÑ   r¾   rÔ   rà   rä   ré   r¤   r   ÚTestCaser‰   ÚhasattrrÅ   r‹   Ú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}.
        Nr  r   r   r   r   r   €  s   zFakePool.connectc                 C   r¯   )z
        Do nothing.
        Nr   )r   Ú
connectionr   r   r   r‚   †  rM   zFakePool.disconnectN)	r‰   rŠ   r‹   rŒ   Ú	reconnectZnoisyr  r   r‚   r   r   r   r   r  q  s    r  c                   @   ó   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                   @   ó   e Zd Zdd„ ZdS )zIConnectionTests.test_rollbackErrorLogged.<locals>.ConnectionRollbackRaisec                 S   ó   t dƒ‚©Núproblem!©ÚRuntimeErrorr   r   r   r   Úrollback˜  ó   zRConnectionTests.test_rollbackErrorLogged.<locals>.ConnectionRollbackRaise.rollbackN)r‰   rŠ   r‹   r  r   r   r   r   ÚConnectionRollbackRaise—  ó    r  rf   r   r  N)r  r   ÚassertRaisesr   r  r5   r  rs   rh   Úvaluer´   )r   r  Úpoolr  Úerrorsr   r   r   Útest_rollbackErrorLogged‘  s   
z(ConnectionTests.test_rollbackErrorLoggedN)r‰   rŠ   r‹   rŒ   r  r   r   r   r   r  Œ  ó    r  c                   @   r  )Ú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                   @   rÓ   )zNTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaiser   c                 S   rJ   r   r   r   r   r   r   r  ±  ó   zXTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaise.reconnectc                 S   s$   | j dkr|  j d7  _ tdƒ‚d S )Nr   rf   r  )Úcountr  r   r   r   r   r€   ´  s   
þzUTransactionTests.test_reopenLogErrorIfReconnect.<locals>.ConnectionCursorRaise.cursorN)r‰   rŠ   r‹   r  r  r€   r   r   r   r   ÚConnectionCursorRaise®  s    r  Nrf   r   r  )	r  r   Zreopenr5   r  rs   rh   r  r´   )r   r  r  r†   r  r   r   r   Útest_reopenLogErrorIfReconnect¨  s   
z/TransactionTests.test_reopenLogErrorIfReconnectN)r‰   rŠ   r‹   rŒ   r  r   r   r   r   r  £  r  r  c                   @   r	  )ÚNonThreadPoolc                 O   sB   d}z	||i |¤Ž}W n t y   d}tƒ }Y nw |||ƒ d S )NTF)Ú	Exceptionr   )r   ZonResultrL   Úarµ   Úsuccessrz   r   r   r   ÚcallInThreadWithCallbackÂ  s   
þz&NonThreadPool.callInThreadWithCallbackN)r‰   rŠ   r‹   r"  r   r   r   r   r  Á  r  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)r‰   rŠ   r‹   rŒ   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   Úrunningr   r   r   r  å  s   
zEventReactor.__init__c                 C   s   | j r|ƒ  d S |  dd|¡S )NÚafterÚstartup)r%  ÚaddSystemEventTrigger)r   Úfunctionr   r   r   ÚcallWhenRunningé  rˆ   zEventReactor.callWhenRunningc                 C   s   |||f}| j  |¡ |S r   )r&  rm   )r   ÚphaseÚeventÚtriggerÚhandler   r   r   r*  ï  s   
z"EventReactor.addSystemEventTriggerc                 C   s   | j  |¡ d S r   )r&  Úremove)r   r0  r   r   r   ÚremoveSystemEventTriggerô  s   z%EventReactor.removeSystemEventTriggerN)r‰   rŠ   r‹   rŒ   r  r,  r*  r2  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                   @   ó   e Zd Zdd„ Zdd„ ZdS )z]ConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaisec                 S   rJ   r   r   ©r   r  r   r   r   r    r  zfConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaise.__init__c                 S   r
  r  r  r   r   r   r   r    r  zfConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.ConnectionRollbackRaise.rollbackN©r‰   rŠ   r‹   r  r  r   r   r   r   r    ó    r  c                 S   r
  ©NZfoo©Ú
ValueError)r  r   r   r   ÚraisingFunction
  r  zUConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.raisingFunctionc                    ó6   ˆ   t¡}ˆ  t|ƒd¡ ˆ  |d jjd d¡ d S ©Nrf   r   r  ©r5   r  rs   rh   r  r´   ©Zignoredr  r   r   r   ÚcbFailed  ó   
zNConnectionPoolTests.test_runWithConnectionRaiseOriginalError.<locals>.cbFailedN)r#  r  rX   Ú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                   @   r	  )zDConnectionPoolTests.test_closeLogError.<locals>.ConnectionCloseRaisec                 S   r
  r  r  r   r   r   r   r!      r  zJConnectionPoolTests.test_closeLogError.<locals>.ConnectionCloseRaise.closeN)r‰   rŠ   r‹   r!   r   r   r   r   ÚConnectionCloseRaise  r  rD  rf   r   r  N)r#  Ú_closer5   r  rs   rh   r  r´   )r   rD  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                   @   r4  )z^ConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaisec                 S   rJ   r   r   r5  r   r   r   r  1  r  zgConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaise.__init__c                 S   r
  r  r  r   r   r   r   r  4  r  zgConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.ConnectionRollbackRaise.rollbackNr6  r   r   r   r   r  0  r7  r  c                   @   r	  )zWConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.DummyTransactionc                 S   rJ   r   r   )r   r  r  r   r   r   r  8  r  z`ConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.DummyTransaction.__init__N)r‰   rŠ   r‹   r  r   r   r   r   ÚDummyTransaction7  r  rG  c                 S   r
  r8  r9  )r†   r   r   r   r;  ;  r  zVConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.raisingFunctionc                    r<  r=  r>  r?  r   r   r   r@  E  rA  zOConnectionPoolTests.test_runWithInteractionRaiseOriginalError.<locals>.cbFailedN)r#  r  ZtransactionFactoryrU   rB  r:  r,   )r   r  rG  r;  r  r.   r@  r   r   r   Ú)test_runWithInteractionRaiseOriginalError*  s   

z=ConnectionPoolTests.test_runWithInteractionRaiseOriginalErrorc                 C   óD   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   rs   r&  Ú_startr!   r¡   ©r   r
   r  r   r   r   Útest_unstartedCloseM  ó
   z'ConnectionPoolTests.test_unstartedClosec                 C   rI  )z�
        If L{ConnectionPool.close} is called after it has been started, but
        not by its shutdown trigger, the shutdown trigger is cancelled.
        TrJ  rK  ZduringÚshutdownN)r$  r   rs   r&  Z
finalCloser!   r¡   rM  r   r   r   Útest_startedCloseZ  rO  z%ConnectionPoolTests.test_startedCloseN)	r‰   rŠ   r‹   rŒ   rC  rF  rH  rN  rQ  r   r   r   r   r3  ø  s    #r3  ))rŒ   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   r6   r   r’   r£   r¾   rÑ   rÔ   rà   rä   ré   r   rý   r  rø   r  r  r  r#  r$  r3  r   r   r   r   Ú<module>   s<    ]PA4$