î
5dÝV$  ã               @   s»   d  d l  Z  d d l 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)Ú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   úC/tmp/pip-build-0jahl3lb/psycopg2/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_rollback5   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_commit@   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_commitM   s    z#TransactionTests.test_failed_commitN)Ú__name__Ú
__module__Ú__qualname__r
   r   r   r   r   r   r   r   r	       s   r	   c               @   sR   e  Z d  Z d Z d d „  Z d d „  Z d d „  Z d d	 „  Z 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
   d   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>.task2r/   )r'   r-   r0   r1   r2   r3   r4   r5   r6   r7   r   r8   r9   )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!   \   s   .r!   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   r8   ZQueryCanceledError)r   r   r   r   r   Útest_statement_timeoutê   s    z-QueryCancellationTests.test_statement_timeoutN)r   r   r    r?   r
   r   rB   r   r   r   r   r@   ã   s   r@   c               C   s   t  j ƒ  j t ƒ S)N)r   Z
TestLoaderZloadTestsFromNamer   r   r   r   r   Ú
test_suiteó   s    rC   Ú__main__)r0   Z	testutilsr   r   r   r   Zpsycopg2.extensionsr   r   r   r	   r!   r@   rC   r   Úmainr   r   r   r   Ú<module>   s   <‡