î
yÐR\$  ã               @   sÁ   d  d l  Z  d d l m Z m Z m Z m Z d  d l Z d  d l m Z m	 Z	 m
 Z
 Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd	 d
 „  d
 e ƒ Z d d „  Z e d k r½ e j ƒ  n  d S)é    Né   )ÚunittestÚConnectingTestCaseÚskip_before_postgresÚslow)ÚISOLATION_LEVEL_SERIALIZABLEÚSTATUS_BEGINÚSTATUS_READYc               @   s@   e  Z d  Z d d „  Z d d „  Z d d „  Z d d „  Z d	 S)
ÚTransactionTestsc             C   sq   t  j |  ƒ |  j j t ƒ |  j j ƒ  } | j d ƒ | j d ƒ | j d ƒ | j d ƒ |  j j ƒ  d  S)Nz[
            CREATE TEMPORARY TABLE table1 (
              id int PRIMARY KEY
            )zä
            CREATE TEMPORARY TABLE table2 (
              id int PRIMARY KEY,
              table1_id int,
              CONSTRAINT table2__table1_id__fk
                FOREIGN KEY (table1_id) REFERENCES table1(id) DEFERRABLE)zINSERT INTO table1 VALUES (1)z INSERT INTO table2 VALUES (1, 1))r   ÚsetUpÚconnÚset_isolation_levelr   ÚcursorÚexecuteÚcommit)ÚselfÚcurs© r   úT/var/www/dbchiro/venv/lib/python3.4/site-packages/psycopg2/tests/test_transaction.pyr   #   s    zTransactionTests.setUpc             C   s|   |  j  j ƒ  } | j d ƒ |  j |  j  j t ƒ |  j  j ƒ  |  j |  j  j t ƒ | j d ƒ |  j | j ƒ  g  ƒ d  S)Nz INSERT INTO table2 VALUES (2, 1)z-SELECT id, table1_id FROM table2 WHERE id = 2)	r   r   r   ÚassertEqualÚstatusr   Úrollbackr	   Úfetchall)r   r   r   r   r   Útest_rollback6   s    zTransactionTests.test_rollbackc             C   sŒ   |  j  j ƒ  } | j d ƒ |  j |  j  j t ƒ |  j  j ƒ  |  j |  j  j t ƒ |  j  j ƒ  | j d ƒ |  j | j	 ƒ  d g ƒ d  S)Nz INSERT INTO table2 VALUES (2, 1)z-SELECT id, table1_id FROM table2 WHERE id = 2é   r   )r   r   )
r   r   r   r   r   r   r   r	   r   r   )r   r   r   r   r   Útest_commitA   s    zTransactionTests.test_commitc             C   s™   |  j  j ƒ  } | j d ƒ | j d ƒ |  j |  j  j t ƒ |  j t j |  j  j	 ƒ |  j |  j  j t
 ƒ | j d ƒ |  j | j ƒ  d d ƒ d  S)Nz.SET CONSTRAINTS table2__table1_id__fk DEFERREDz!INSERT INTO table2 VALUES (2, 42)zSELECT 1r   r   )r   r   r   r   r   r   ÚassertRaisesÚpsycopg2ZIntegrityErrorr   r	   Zfetchone)r   r   r   r   r   Útest_failed_commitN   s    z#TransactionTests.test_failed_commitN)Ú__name__Ú
__module__Ú__qualname__r   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 d „  Z e d d	 „  ƒ Z e d
 d „  ƒ Z	 d S)ÚDeadlockSerializationTestsz/Test deadlock and serialization failure errors.c             C   s    t  j |  ƒ } | j t ƒ | S)N)r   Úconnectr   r   )r   r   r   r   r   r#   `   s    z"DeadlockSerializationTests.connectc             C   sÚ   t  j |  ƒ |  j j ƒ  } y | j d ƒ |  j j ƒ  Wn" t j k
 r^ |  j j ƒ  Yn Xy | j d ƒ |  j j ƒ  Wn" t j k
 r¡ |  j j ƒ  Yn X| j d ƒ | j d ƒ | j d ƒ |  j j ƒ  d  S)NzDROP TABLE table1zDROP TABLE table2zj
            CREATE TABLE table1 (
                id int PRIMARY KEY,
                name text)
        z&INSERT INTO table1 VALUES (1, 'hello')z(CREATE TABLE table2 (id int PRIMARY KEY))	r   r   r   r   r   r   r   ÚDatabaseErrorr   )r   r   r   r   r   r   e   s"    z DeadlockSerializationTests.setUpc             C   sG   |  j  j ƒ  } | j d ƒ | j d ƒ |  j  j ƒ  t j |  ƒ d  S)NzDROP TABLE table1zDROP TABLE table2)r   r   r   r   r   ÚtearDown)r   r   r   r   r   r%   ~   s
    z#DeadlockSerializationTests.tearDownc                sï   d  ˆ  _  ˆ  _ t j ƒ  ‰ t j ƒ  ‰ ‡  ‡ ‡ f d d †  } ‡  ‡ ‡ f d d †  } t j d | ƒ } t j d | ƒ } | j ƒ  | j ƒ  | j ƒ  | j ƒ  ˆ  j ˆ  j  o¹ ˆ  j ƒ ˆ  j  pÌ ˆ  j } ˆ  j t	 | t
 j j ƒ ƒ d  S)Nc                 s–   yJ ˆ  j  ƒ  }  |  j ƒ  } | j d ƒ ˆ j ƒ  ˆ j ƒ  | j d ƒ Wn; t j k
 r‡ } z | ˆ  _ ˆ j ƒ  WYd  d  } ~ Xn X|  j ƒ  d  S)Nz$LOCK table1 IN ACCESS EXCLUSIVE MODEz$LOCK table2 IN ACCESS EXCLUSIVE MODE)	r#   r   r   ÚsetÚwaitr   r$   Úthread1_errorÚclose)r   r   Úexc)r   Ústep1Ústep2r   r   Útask1Œ   s    

	z7DeadlockSerializationTests.test_deadlock.<locals>.task1c                 s–   yJ ˆ  j  ƒ  }  |  j ƒ  } ˆ j ƒ  | j d ƒ ˆ j ƒ  | j d ƒ Wn; t j k
 r‡ } z | ˆ  _ ˆ j ƒ  WYd  d  } ~ Xn X|  j ƒ  d  S)Nz$LOCK table2 IN ACCESS EXCLUSIVE MODEz$LOCK table1 IN ACCESS EXCLUSIVE MODE)	r#   r   r'   r   r&   r   r$   Úthread2_errorr)   )r   r   r*   )r   r+   r,   r   r   Útask2™   s    

	z7DeadlockSerializationTests.test_deadlock.<locals>.task2Útarget)r(   r.   Ú	threadingÚEventÚThreadÚstartÚjoinÚassertFalseÚ
assertTrueÚ
isinstancer   Ú
extensionsÚTransactionRollbackError)r   r-   r/   Úthread1Úthread2Úerrorr   )r   r+   r,   r   Útest_deadlock†   s    



	z(DeadlockSerializationTests.test_deadlockc                sï   d  ˆ  _  ˆ  _ t j ƒ  ‰ t j ƒ  ‰ ‡  ‡ ‡ f d d †  } ‡  ‡ ‡ f d d †  } t j d | ƒ } t j d | ƒ } | j ƒ  | j ƒ  | j ƒ  | j ƒ  ˆ  j ˆ  j  o¹ ˆ  j ƒ ˆ  j  pÌ ˆ  j } ˆ  j t	 | t
 j j ƒ ƒ d  S)Nc                 sª   y^ ˆ  j  ƒ  }  |  j ƒ  } | j d ƒ | j ƒ  ˆ j ƒ  ˆ j ƒ  | j d ƒ |  j ƒ  Wn; t j k
 r› } z | ˆ  _	 ˆ j ƒ  WYd  d  } ~ Xn X|  j
 ƒ  d  S)Nz$SELECT name FROM table1 WHERE id = 1z+UPDATE table1 SET name='task1' WHERE id = 1)r#   r   r   r   r&   r'   r   r   r$   r(   r)   )r   r   r*   )r   r+   r,   r   r   r-   ¼   s    


	zDDeadlockSerializationTests.test_serialisation_failure.<locals>.task1c                 s‰   y= ˆ  j  ƒ  }  |  j ƒ  } ˆ j ƒ  | j d ƒ |  j ƒ  Wn1 t j k
 rp } z | ˆ  _ WYd  d  } ~ Xn Xˆ j ƒ  |  j	 ƒ  d  S)Nz+UPDATE table1 SET name='task2' WHERE id = 1)
r#   r   r'   r   r   r   r$   r.   r&   r)   )r   r   r*   )r   r+   r,   r   r   r/   Ë   s    

zDDeadlockSerializationTests.test_serialisation_failure.<locals>.task2r0   )r(   r.   r1   r2   r3   r4   r5   r6   r7   r8   r   r9   r:   )r   r-   r/   r;   r<   r=   r   )r   r+   r,   r   Útest_serialisation_failure¶   s    



	z5DeadlockSerializationTests.test_serialisation_failureN)
r   r    r!   Ú__doc__r#   r   r%   r   r>   r?   r   r   r   r   r"   ]   s   0r"   c               @   s=   e  Z d  Z d Z d d „  Z e d d ƒ d d „  ƒ Z d S)	ÚQueryCancellationTestszTests for query cancellation.c             C   s!   t  j |  ƒ |  j j t ƒ d  S)N)r   r   r   r   r   )r   r   r   r   r   ë   s    zQueryCancellationTests.setUpé   r   c             C   s<   |  j  j ƒ  } | j d ƒ |  j t j j | j d ƒ d  S)NzSET statement_timeout TO 10zSELECT pg_sleep(50))r   r   r   r   r   r9   ZQueryCanceledError)r   r   r   r   r   Útest_statement_timeoutï   s    z-QueryCancellationTests.test_statement_timeoutN)r   r    r!   r@   r   r   rC   r   r   r   r   rA   è   s   rA   c               C   s   t  j ƒ  j t ƒ S)N)r   Z
TestLoaderZloadTestsFromNamer   r   r   r   r   Ú
test_suiteø   s    rD   Ú__main__)r1   Z	testutilsr   r   r   r   r   Zpsycopg2.extensionsr   r   r	   r
   r"   rA   rD   r   Úmainr   r   r   r   Ú<module>   s   "<‹