î
5dÝVl=  ã               @   s»   d  d l  m Z m Z d d l Z d d l m Z d d l Z d d l Z d d l Z d  d l  m Z Gd d „  d e	 ƒ Z
 Gd d	 „  d	 e ƒ Z d
 d „  Z e d k r· e j ƒ  n  d S)é   )ÚunittestÚskip_before_postgresé    N)Ú
extensions)ÚConnectingTestCasec               @   s:   e  Z d  Z d Z d d „  Z d d „  Z d d „  Z d S)	ÚPollableStubz=A 'pollable' wrapper allowing analysis of the `poll()` calls.c             C   s   | |  _  g  |  _ d  S)N)ÚpollableÚpolls)Úselfr   © r   ú=/tmp/pip-build-0jahl3lb/psycopg2/psycopg2/tests/test_async.pyÚ__init__'   s    	zPollableStub.__init__c             C   s   |  j  j ƒ  S)N)r   Úfileno)r
   r   r   r   r   +   s    zPollableStub.filenoc             C   s#   |  j  j ƒ  } |  j j | ƒ | S)N)r   Úpollr	   Úappend)r
   Úrvr   r   r   r   .   s    zPollableStub.pollN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   %   s   r   c               @   s{  e  Z d  Z d d „  Z d d „  Z d d „  Z d d „  Z d	 d
 „  Z e d d ƒ 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 d1 d2 „  Z d3 d4 „  Z d5 d6 „  Z d7 d8 „  Z d9 d: „  Z d; d< „  Z  d= S)>Ú
AsyncTestsc             C   sk   t  j |  ƒ |  j |  _ |  j d d ƒ |  _ |  j |  j ƒ |  j j ƒ  } | j d ƒ |  j | ƒ d  S)NÚasyncTz[
            CREATE TEMPORARY TABLE table1 (
              id int PRIMARY KEY
            ))r   ÚsetUpÚconnÚ	sync_connÚconnectÚwaitÚcursorÚexecute)r
   Úcursr   r   r   r   6   s    zAsyncTests.setUpc             C   s¹   | } t  | d ƒ s! | j } n  x‘ | j ƒ  } | t j j k rF Pq$ | t j j k rt t j | g g  g  d ƒ q$ | t j j k r¢ t j g  | g g  d ƒ q$ t	 d | ƒ ‚ q$ Wd  S)Nr   é
   zUnexpected result from poll: %r)
ÚhasattrÚ
connectionr   Úpsycopg2r   ZPOLL_OKZ	POLL_READÚselectÚ
POLL_WRITEÚ	Exception)r
   Zcur_or_connr   Ústater   r   r   r   E   s    zAsyncTests.waitc             C   sª   |  j  j ƒ  } |  j j ƒ  } |  j |  j  j ƒ |  j |  j j ƒ |  j |  j  j d ƒ |  j |  j  j ƒ |  j |  j  j d k ƒ |  j |  j  j	 t
 j j k ƒ d  S)Nr   é   é   )r(   r)   )r   r   r   Ú
assertTruer   ÚassertEqualZisolation_levelÚserver_versionZprotocol_versionÚencodingr#   r   Ú	encodings)r
   ÚcurÚsync_curr   r   r   Útest_connection_setupT   s    z AsyncTests.test_connection_setupc             C   s    |  j  t j |  j j d ƒ d  S)NÚname)ÚassertRaisesr#   ÚProgrammingErrorr   r   )r
   r   r   r   Útest_async_named_cursorc   s    z"AsyncTests.test_async_named_cursorc             C   s‰   |  j  j ƒ  } |  j |  j  j ƒ  ƒ | j d ƒ |  j |  j  j ƒ  ƒ |  j | ƒ |  j |  j  j ƒ  ƒ |  j | j ƒ  d d ƒ d  S)Nz
select 'a'r   Úa)	r   r   ÚassertFalseÚisexecutingr   r*   r   r+   Úfetchone)r
   r/   r   r   r   Útest_async_selectg   s    zAsyncTests.test_async_selecté   r(   c             C   sz   |  j  j ƒ  } | j d d ƒ |  j |  j  j ƒ  ƒ |  j | ƒ |  j |  j  j ƒ  ƒ |  j | j ƒ  d d d ƒ d  S)NZpg_sleepçš™™™™™¹?r   Ú )r<   )	r   r   Úcallprocr*   r8   r   r7   r+   Úfetchall)r
   r/   r   r   r   Útest_async_callprocr   s    zAsyncTests.test_async_callprocc             C   sð   |  j  j ƒ  } |  j  j ƒ  } | j d ƒ |  j t j | j d ƒ |  j t j | j d ƒ |  j | ƒ | j d ƒ |  j | ƒ |  j | j	 ƒ  d d d ƒ | j d ƒ |  j | ƒ | j d ƒ |  j | ƒ |  j | j
 ƒ  d  ƒ d  S)Nzinsert into table1 values (1)zselect * from table1Úversionr   r   zdelete from table1)r   r   r   r3   r#   r4   r>   r   r+   r?   r9   )r
   r/   Úcur2r   r   r   Útest_async_after_async|   s     z!AsyncTests.test_async_after_asyncc             C   sa   |  j  j ƒ  } | j d ƒ |  j t j | j ƒ |  j | ƒ |  j | j ƒ  d d d ƒ d  S)Nz
select 'a'r   r6   )	r   r   r   r3   r#   r4   r?   r   r+   )r
   r/   r   r   r   Útest_fetch_after_async—   s    
z!AsyncTests.test_fetch_after_asyncc             C   s9   |  j  j ƒ  } | j d ƒ |  j t j |  j  j ƒ d  S)Nz
select 'a')r   r   r   r3   r#   r4   Úrollback)r
   r/   r   r   r   Útest_rollback_while_async¢   s    z$AsyncTests.test_rollback_while_asyncc             C   s  |  j  j ƒ  } | j d ƒ |  j | ƒ | j d ƒ |  j t j |  j  j ƒ |  j |  j  j	 ƒ  ƒ |  j | ƒ | j d ƒ |  j | ƒ | j d ƒ |  j | ƒ |  j
 | j ƒ  d d d ƒ | j d ƒ |  j | ƒ | j d ƒ |  j | ƒ |  j
 | j ƒ  d  ƒ d  S)NÚbeginzinsert into table1 values (1)Úcommitzselect * from table1r   r   zdelete from table1)r   r   r   r   r3   r#   r4   rH   r*   r8   r+   r?   r9   )r
   r/   r   r   r   Útest_commit_while_asyncª   s"    z"AsyncTests.test_commit_while_asyncc             C   s    |  j  j ƒ  } | j d ƒ |  j |  j  j ƒ  ƒ |  j |  j  j ƒ  t j ƒ |  j |  j  j ƒ  ƒ |  j	 t
 j |  j  j d ƒ |  j	 t
 j |  j  j d ƒ d  S)Nz
select 'c'ZLATIN1r   )r   r   r   r*   r8   r+   Zget_transaction_statusr   ZTRANSACTION_STATUS_ACTIVEr3   r#   r4   Zset_client_encodingZset_isolation_level)r
   r/   r   r   r   Útest_set_parameters_while_asyncÆ   s    
z*AsyncTests.test_set_parameters_while_asyncc             C   sO   |  j  j ƒ  } | j d ƒ |  j |  j  j ƒ  ƒ |  j t j |  j  j ƒ d  S)Nz
select 'c')	r   r   r   r*   r8   r3   r#   r4   Úreset)r
   r/   r   r   r   Útest_reset_while_asyncÙ   s    z!AsyncTests.test_reset_while_asyncc             C   s¬   |  j  j ƒ  } | j d ƒ |  j | ƒ | j d ƒ |  j | ƒ | j d ƒ |  j t j t | ƒ |  j | ƒ |  j t | ƒ d d d	 g ƒ |  j	 |  j  j
 ƒ  ƒ d  S)
NrG   zŠ
            insert into table1 values (1);
            insert into table1 values (2);
            insert into table1 values (3);
        z!select id from table1 order by idr   r(   r)   )r   )r(   )r)   )r   r   r   r   r3   r#   r4   Úlistr+   r7   r8   )r
   r/   r   r   r   Útest_async_iterá   s    zAsyncTests.test_async_iterc             C   sE   |  j  j ƒ  } | j d ƒ |  j t j | j t j d ƒ d ƒ d  S)Nz
select 'a'z	1
3
5
\.
Ztable1)	r   r   r   r3   r#   r4   Z	copy_fromÚioÚStringIO)r
   r/   r   r   r   Útest_copy_while_asyncö   s
    z AsyncTests.test_copy_while_asyncc             C   s   |  j  t j |  j j ƒ d  S)N)r3   r#   r4   r   Zlobject)r
   r   r   r   Útest_lobject_while_asyncÿ   s    z#AsyncTests.test_lobject_while_asyncc             C   s8   |  j  j ƒ  } |  j t j | j d d d d g ƒ d  S)Nzinsert into table1 values (%s)r   r(   r)   )r   r   r3   r#   r4   Zexecutemany)r
   r/   r   r   r   Útest_async_executemany  s    z!AsyncTests.test_async_executemanyc             C   sh  |  j  j ƒ  } | j d ƒ |  j | ƒ | j d ƒ |  j t j | j d ƒ |  j |  j  j	 ƒ  ƒ |  j | ƒ | j d ƒ |  j
 | j ƒ  d d g ƒ |  j  j ƒ  } | j d ƒ |  j | ƒ |  j  j ƒ  } |  j t j | j d ƒ |  j t j | j d ƒ |  j  j ƒ  } | j d ƒ |  j | ƒ | j d ƒ | j d	 ƒ |  j
 | j ƒ  d
 d g ƒ d  S)NzŠ
            insert into table1 values (1);
            insert into table1 values (2);
            insert into table1 values (3);
        z!select id from table1 order by idr   r(   r)   é   )r(   )r)   éÿÿÿÿ)r(   )r)   )r   r   r   r   r3   r#   r4   Úscrollr*   r8   r+   r?   )r
   r/   rB   r   r   r   Útest_async_scroll
  s,    zAsyncTests.test_async_scrollc             C   sp   |  j  j ƒ  } | j d ƒ | j d ƒ | j d ƒ | j d ƒ | j d ƒ |  j | j ƒ  d d	 g ƒ d  S)
Nzcreate table table1 (id int)zŠ
            insert into table1 values (1);
            insert into table1 values (2);
            insert into table1 values (3);
        z!select id from table1 order by idr(   r   r)   rU   )r(   )r)   )r   r   r   rV   r+   r?   )r
   r/   r   r   r   Útest_scroll-  s    zAsyncTests.test_scrollc             C   sK   |  j  j ƒ  } | j d ƒ |  j | ƒ |  j | j ƒ  d d d ƒ d  S)Nz4select repeat('a', 10000); select repeat('b', 10000)r   Úbi'  )r   r   r   r   r+   r9   )r
   r/   r   r   r   Útest_async_dont_read_all:  s    z#AsyncTests.test_async_dont_read_allc             C   sh   Gd d „  d t  j j ƒ } |  j d | d d ƒ } |  j t | | ƒ ƒ |  j | j ƒ | j ƒ  d  S)Nc               @   s   e  Z d  Z d d d „ Z d S)z.AsyncTests.test_async_subclass.<locals>.MyConnr   c             S   s    t  j j j |  | d | ƒd  S)Nr   )r#   r   r"   r   )r
   Zdsnr   r   r   r   r   F  s    z7AsyncTests.test_async_subclass.<locals>.MyConn.__init__N)r   r   r   r   r   r   r   r   ÚMyConnE  s   r[   Úconnection_factoryr   T)r#   r   r"   r   r*   Ú
isinstancer   Úclose)r
   r[   r   r   r   r   Útest_async_subclassD  s
    zAsyncTests.test_async_subclassc             C   sÀ   |  j  j ƒ  } x‘ d D]‰ } | d d } t |  j  ƒ } | j d d | f ƒ |  j | ƒ |  j | t | j ƒ  d	 ƒ ƒ | j j	 t
 j j ƒ d k r d  Sq Wd	 d  l } | j d
 ƒ d  S)Nr   é   r    é   é2   i   z
select %s;Úxr   z4sending a large query didn't trigger block on write.)r   r`   r    ra   rb   )r   r   r   r   r   r+   Úlenr9   r	   Úcountr#   r   r%   ÚwarningsÚwarn)r
   r   ÚmbÚsizeZstubrf   r   r   r   Útest_flush_on_writeN  s     zAsyncTests.test_flush_on_writec             C   sG   |  j  j ƒ  } | j d ƒ | j j ƒ  |  j | j ƒ  d d ƒ d  S)Nzselect 1r   r   )r   r   r   r"   r   r+   r9   )r
   r/   r   r   r   Útest_sync_polla  s    zAsyncTests.test_sync_pollc             C   s  |  j  j ƒ  } |  j j ƒ  } | j d ƒ |  j j ƒ  | j d ƒ |  j | ƒ |  j |  j j g  ƒ |  j  j ƒ  } x‚ t	 d ƒ D]t } |  j |  j ƒ |  j j s¹ t
 j d ƒ q„ n  |  j t |  j j ƒ d ƒ |  j |  j j j ƒ  | d f ƒ d  SW|  j d ƒ d  S)Nzlisten test_notifyznotify test_notifyr`   g      à?r   Útest_notifyzNo NOTIFY in 2.5 seconds)r   r   r   r   rH   r   r+   ZnotifiesZget_backend_pidÚrangeÚtimeÚsleeprd   ÚpopÚfail)r
   r/   r0   ÚpidÚ_r   r   r   rl   h  s$    zAsyncTests.test_notifyc             C   s‚   |  j  j ƒ  } |  j  j ƒ  } | j d ƒ |  j | ƒ |  j |  j  j ƒ  ƒ |  j t j | j	 ƒ |  j
 | j	 ƒ  d d ƒ d  S)Nzselect 1r   r   )r   r   r   r   r7   r8   r3   r#   r4   r9   r+   )r
   Zcur1rB   r   r   r   Útest_async_fetch_wrong_cursor  s    z(AsyncTests.test_async_fetch_wrong_cursorc             C   s  |  j  j ƒ  } | j d d ƒ |  j | ƒ | j d d	 ƒ |  j t j |  j | ƒ | j d d
 ƒ |  j t j |  j | ƒ | j d d ƒ |  j | ƒ | j d d ƒ |  j | ƒ | j d ƒ |  j | ƒ |  j | j ƒ  d d d g ƒ | j d ƒ |  j | ƒ d  S)Nzinsert into table1 values (%s)r   z>insert into table1 values (%s); insert into table1 values (%s)r(   r)   z select * from table1 order by idzdelete from table1)r   )r   )r(   r(   )r(   )r)   )r   )r(   )r)   )	r   r   r   r   r3   r#   ZIntegrityErrorr+   r?   )r
   r/   r   r   r   Ú
test_error‹  s"    	zAsyncTests.test_errorc             C   s|   |  j  j ƒ  } |  j  j ƒ  } | j d ƒ |  j t j |  j | ƒ | j d ƒ |  j | ƒ |  j | j ƒ  d d ƒ d  S)Nzselect * from no_such_tablezselect 1r   r   )	r   r   r   r3   r#   r4   r   r+   r9   )r
   r/   rB   r   r   r   Útest_error_two_cursors¢  s    z!AsyncTests.test_error_two_cursorsc             C   s•   |  j  j d  d  … =|  j  j ƒ  } |  j  j d k rQ | j d ƒ |  j | ƒ n  | j d ƒ |  j | ƒ |  j d | j ƒ |  j |  j  j ƒ d  S)Ni¼` zset client_min_messages=debug1z1create temp table chatty (id serial primary key);zCREATE TABLE)	r   Znoticesr   r,   r   r   r+   Zstatusmessager*   )r
   r/   r   r   r   Útest_notices«  s    zAsyncTests.test_noticesc             C   s—   d d  l  } |  j j ƒ  } | j d ƒ ~ | j ƒ  |  j t j |  j |  j ƒ |  j j ƒ  } | j d ƒ |  j |  j ƒ |  j	 | j
 ƒ  d ƒ d  S)Nr   z
select 42;é*   )rx   )Úgcr   r   r   Zcollectr3   r#   ZInterfaceErrorr   r+   r9   )r
   ry   r/   r   r   r   Útest_async_cursor_gone¶  s    
z!AsyncTests.test_async_cursor_gonec             C   s{   y& t  j d d d ƒ} |  j | ƒ WnA t  j k
 ri } z |  j t | ƒ d d ƒ WYd  d  } ~ Xn X|  j d ƒ d  S)Nzdbname=thisdatabasedoesntexistr   Tzasynchronous connection failedzconnection error reason lostzno exception raised)r#   r   r   ÚErrorZassertNotEqualÚstrrq   )r
   ZcnnÚer   r   r   Ú#test_async_connection_error_messageÄ  s    z.AsyncTests.test_async_connection_error_messageN)!r   r   r   r   r   r1   r5   r:   r   r@   rC   rD   rF   rI   rJ   rL   rN   rQ   rR   rS   rW   rX   rZ   r_   rj   rk   rl   rt   ru   rv   rw   rz   r~   r   r   r   r   r   4   s:   
	#

	r   c               C   s   t  j ƒ  j t ƒ S)N)r   Z
TestLoaderZloadTestsFromNamer   r   r   r   r   Ú
test_suiteÏ  s    r   Ú__main__)Z	testutilsr   r   r#   r   rn   r$   rO   r   Úobjectr   r   r   r   Úmainr   r   r   r   Ú<module>   s   ÿ œ