
5dV                 @   s   d  d l  m Z d d l Z d d l m Z d  d l  m Z m Z d  d l m Z d d l Z d d l	 Z	 d d l
 Z
 d d l m Z m Z Gd d	   d	 e  Z d
 d   Z e d k r e j   n  d S)   )unittest    N)
extensions)ConnectingTestCasescript_to_py3)dsn)PopenPIPEc               @   s   e  Z d  Z d d   Z d d   Z 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 S)NotifiesTestsc             C   s   | j  t j  d S)z$Set a connection in autocommit mode.N)Zset_isolation_levelr   ZISOLATION_LEVEL_AUTOCOMMIT)selfconn r   >/tmp/pip-build-0jahl3lb/psycopg2/psycopg2/tests/test_notify.py
autocommit(   s    zNotifiesTests.autocommitc             C   s.   |  j  j   } | j d |  | j   d S)z(Start listening for a name on self.conn.zLISTEN N)r   cursorexecuteclose)r   nameZcursr   r   r   listen,   s    zNotifiesTests.listenr   Nc             C   sq   | d k r d } n
 d | } d i t  j d 6t d 6| d 6| d 6| d	 6} t t j d
 t |  g d t S)z@Send a notification to the database, eventually after some time.N z, %ra5  import time
time.sleep(%(sec)s)
import %(module)s as psycopg2
import %(module)s.extensions as ext
conn = psycopg2.connect(%(dsn)r)
conn.set_isolation_level(ext.ISOLATION_LEVEL_AUTOCOMMIT)
print conn.get_backend_pid()
curs = conn.cursor()
curs.execute("NOTIFY " %(name)r %(payload)r)
curs.close()
conn.close()
moduler   secr   payloadz-cstdout)psycopg2__name__r   r   sys
executabler   r	   )r   r   r   r   scriptr   r   r   notify2   s    	

 zNotifiesTests.notifyc             C   s=  |  j  |  j  |  j d  |  j d d  } t j   } t j |  j g g  g  d  } t j   } |  j d | | k  o d k  n | |  t | j   d  } |  j	 d t
 |  j j   |  j	 t j |  j j    |  j	 d t
 |  j j   |  j	 | |  j j d d  |  j	 d |  j j d d  d  S)Nfoor      gGz?   r   )r   r   r   r   timeselect
assertTrueintcommunicateassertEquallennotifiesr   POLL_OKpoll)r   proct0readyt1pidr   r   r   test_notifies_received_on_pollK   s    .z,NotifiesTests.test_notifies_received_on_pollc             C   sB  |  j  |  j  x$ d d d g D] } |  j |  q  Wi  } x= d d d d g D]) } t |  j |  j   d  | | <qP W|  j d t |  j j   x0 t	 d  D]" } |  j t
 j |  j j    q W|  j d t |  j j   t j d d d g  } x; |  j j D]- \ } } |  j | | |  | j |  qWd  S)Nr    barbazZquxr   
      )r   r   r   r&   r   r'   r(   r)   r*   ranger   r+   r,   dictfromkeyspop)r   r   Zpidsinamesr1   r   r   r   test_many_notifies]   s    ' z NotifiesTests.test_many_notifiesc             C   s   |  j  |  j  |  j d  t |  j d  j   d  } |  j d t |  j j   |  j j	   j
 d  |  j d t |  j j   |  j | |  j j d d  |  j d |  j j d d  d  S)Nr    r   z	select 1;r   )r   r   r   r&   r   r'   r(   r)   r*   r   r   )r   r1   r   r   r   !test_notifies_received_on_executep   s    z/NotifiesTests.test_notifies_received_on_executec             C   sz   |  j  |  j  |  j d  |  j d  j   t j d  |  j j   |  j j d } |  j	 t
 | t j j   d  S)Nr    g      ?r   )r   r   r   r   r'   r#   sleepr,   r*   r%   
isinstancer   r   Notify)r   r   r   r   r   test_notify_objectz   s    z NotifiesTests.test_notify_objectc             C   s   |  j  |  j  |  j d  t |  j d  j   d  } t j d  |  j j   |  j	 d t
 |  j j   |  j j d } |  j	 | | j  |  j	 d | j  |  j	 d | j  d  S)Nr    r   g      ?r   r   )r   r   r   r&   r   r'   r#   r?   r,   r(   r)   r*   r1   channelr   )r   r1   r   r   r   r   test_notify_attributes   s    z$NotifiesTests.test_notify_attributesc             C   s   |  j  j d k  r) |  j d |  j  j  S|  j |  j   |  j d  t |  j d d d j   d  } t j	 d  |  j  j
   |  j d t |  j  j   |  j  j d } |  j | | j  |  j d | j  |  j d | j  d  S)	Ni_ z0server version %s doesn't support notify payloadr    r   zHello, world!r   g      ?r   )r   Zserver_versionZskipTestr   r   r&   r   r'   r#   r?   r,   r(   r)   r*   r1   rC   r   )r   r1   r   r   r   r   test_notify_payload   s    	%z!NotifiesTests.test_notify_payloadc             C   s   t  j j d d  } |  j d | j  |  j d | j  |  j d | j  | \ } } |  j | | f d  t  j j d d d  } |  j d | j  |  j d | j  |  j d | j  | \ } } |  j | | f d  d  S)	Nr5   r    r   *   r3   r4   )r5   zfoo)rF   zbar)r   r   rA   r(   r1   rC   r   )r   nr1   rC   r   r   r   test_notify_init   s    zNotifiesTests.test_notify_initc             C   s   d d d d	 g } x{ | D]s } xj | D]b } t  j j |   } t  j j |   } |  j | | k | | k  |  j | | k | | k  q& Wq Wd  S)
Nr5   r       r3   r4   )r5   foo)rI   rJ   )r5   rJ   zbar)r5   rJ   zbaz)r   r   rA   r(   )r   dataZd1d2Zn1Zn2r   r   r   test_compare   s    zNotifiesTests.test_comparec             C   s{   d d l  m } |  j d | d d   |  j d | d d d   |  j d	 | d d   |  j d
 | d d   d  S)Nr   )rA   r5   r    r3   rI   )r5   foo)r5   rN   )r5   rN   )r5   rN   )psycopg2.extensionsrA   r(   assertNotEqual)r   rA   r   r   r   test_compare_tuple   s
    z NotifiesTests.test_compare_tuplec             C   sj   d d l  m } |  j t d  t | d d    |  j t | d d d   t | d d    d  S)Nr   )rA   r5   r    r3   )r5   zfoo)rO   rA   r(   hashrP   )r   rA   r   r   r   	test_hash   s    %zNotifiesTests.test_hash)r   
__module____qualname__r   r   r   r2   r=   r>   rB   rD   rE   rH   rM   rQ   rS   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    rV   __main__)Z	testutilsr   r   r   r   r   Z
testconfigr   r   r#   r$   
subprocessr   r	   r
   rV   r   mainr   r   r   r   <module>   s   