
5dV                 @   sj  d  d l  Z  d  d l 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	 m
 Z
 m Z d d l m Z m Z d d l m Z m Z d d l m Z d d l m Z m Z Gd	 d
   d
 e  Z Gd d   d e  Z Gd d   d e  Z e
 e e  Gd d   d e  Z Gd d   d e  Z d d   Z e d k rfe	 j   n  d S)    N)
attrgetter   )unittestdecorate_all_testsskip_if_no_superuser)skip_before_postgresskip_after_postgres)ConnectingTestCaseskip_if_tpc_disabled)skip_if_windows)dsndbnamec               @   s*  e  Z d  Z d d   Z d d   Z d d   Z e d d  e e d	 d
      Z	 d d   Z
 d 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, S)-ConnectionTestsc             C   s=   |  j  } |  j | j d  | j   |  j | j d  d  S)NFT)connassertEqualclosedclose)selfr    r   B/tmp/pip-build-0jahl3lb/psycopg2/psycopg2/tests/test_connection.pytest_closed_attribute*   s    	
z%ConnectionTests.test_closed_attributec             C   s1   |  j  } | j   | j   |  j | j  d  S)N)r   r   
assertTruer   )r   r   r   r   r   test_close_idempotent0   s    	

z%ConnectionTests.test_close_idempotentc             C   sr   |  j  } | j   } |  j | j d  | j   |  j | j d  | j   } | j   |  j | j d  d  S)NFT)r   cursorr   r   r   )r   r   cursr   r   r   test_cursor_closed_attribute6   s    	

z,ConnectionTests.test_cursor_closed_attribute      c             C   s   |  j  } | j   } y | j d  Wn t j k
 rk } z  | j t j j k rY   n  WYd  d  } ~ Xn= t j k
 r } z | j d  k	 r   n  WYd  d  } ~ Xn X|  j	 | j
 d  | j   |  j	 | j
 d  d  S)Nz-select pg_terminate_backend(pg_backend_pid())   r   )r   r   executepsycopg2ZOperationalErrorZpgcodeZ
errorcodesZADMIN_SHUTDOWNZDatabaseErrorr   r   r   )r   r   curer   r   r   test_cleanup_on_badconn_closeB   s    	
z-ConnectionTests.test_cleanup_on_badconn_closec             C   sS   |  j  } | j } | j d  |  j | j d  | j   |  j | j |  d  S)Nr   )r   isolation_levelset_isolation_levelr   reset)r   r   levelr   r   r   
test_resetX   s    		
zConnectionTests.test_resetc             C   sk   |  j  } | j   } |  j  j d k r7 | j d  n  | j d  |  j d | j  |  j | j  d  S)Ni` zset client_min_messages=debug1z1create temp table chatty (id serial primary key);zCREATE TABLE)r   r   server_versionr   r   Zstatusmessager   notices)r   r   r!   r   r   r   test_noticesb   s    	zConnectionTests.test_noticesc             C   s   |  j  } | j   } |  j  j d k r7 | j d  n  | j d  | j d  |  j d t | j   |  j d | j d k  |  j d | j d	 k  |  j d
 | j d k  |  j d | j d k  d  S)Ni` zset client_min_messages=debug1zKcreate temp table table1 (id serial); create temp table table2 (id serial);zKcreate temp table table3 (id serial); create temp table table4 (id serial);r   Ztable1r   Ztable2r   Ztable3r   Ztable4   )r   r   r)   r   r   lenr*   r   )r   r   r!   r   r   r   test_notices_consistent_orderk   s    	z-ConnectionTests.test_notices_consistent_orderc             C   s   |  j  } | j   } |  j  j d k r7 | j d  n  xP t d d d  D]< } d j d d   t | | d  D  } | j |  qJ W|  j d	 t | j   |  j	 d
 | j d k | j d  d  S)Ni` zset client_min_messages=debug1r   d   
    c             S   s   g  |  ] } d  |  q S)z&create temp table table%d (id serial);r   ).0jr   r   r   
<listcomp>~   s   	 z8ConnectionTests.test_notices_limited.<locals>.<listcomp>2   Ztable99r   r6   )
r   r   r)   r   rangejoinr   r-   r*   r   )r   r   r!   iZsqlr   r   r   test_notices_limitedx   s    	)z$ConnectionTests.test_notices_limitedc             C   s   |  j  |  j j  d  S)N)r   r   r)   )r   r   r   r   test_server_version   s    z#ConnectionTests.test_server_versionc             C   s&   |  j  |  j j d k |  j j  d  S)Nr   r,   )r   r,   )r   r   Zprotocol_version)r   r   r   r   test_protocol_version   s    z%ConnectionTests.test_protocol_versionc             C   sH   |  j  } | j d k r% |  j d  S|  j t j | j d d d  d  S)Ni8 ztpc is supported*   foobar)r   r)   ZskipTestassertRaisesr    ZNotSupportedErrorxid)r   cnnr   r   r   test_tpc_unsupported   s
    	z$ConnectionTests.test_tpc_unsupportedr   c                s     f d d   } t  j d |  } t  j d |  } t j   } | j   | j   | j   | j     j t j   | d k  d  d  S)Nc                 s=     j    }  |  j   } | j d  | j   |  j   d  S)Nzselect pg_sleep(4))connectr   r   r   )rB   r!   )r   r   r   slave   s
    
z8ConnectionTests.test_concurrent_execution.<locals>.slavetarget   zsomething broken in concurrency)	threadingThreadtimestartr8   r   )r   rE   t1t2t0r   )r   r   test_concurrent_execution   s    



z)ConnectionTests.test_concurrent_executionc             C   sc   |  j  j d  |  j  j   } t j j t j j |  | j d  |  j | j	   d d  d  S)NZEUC_JPzselect 'foo'::text;r   r>   )
r   set_client_encodingr   r    
extensionsZregister_typeUNICODEr   r   fetchone)r   r!   r   r   r   test_encoding_name   s
    z"ConnectionTests.test_encoding_namec             C   sm   |  j  j   t j j d  } d t j d <z |  j   |  _  Wd  | d  k	 r^ | t j d <n
 t j d =Xd  S)NZPGCLIENTENCODINGzutf-8)r   r   osenvirongetrD   )r   Zoldencr   r   r   test_connect_nonnormal_envvar   s    z-ConnectionTests.test_connect_nonnormal_envvarc             C   sh   d d l  m } d d  l } t j t  } | |  } | j   ~ | j   |  j |   d  k  d  S)Nr   )ref)	weakrefrY   gcr    rD   r   r   Zcollectr   )r   rY   r[   r   wr   r   r   test_weakref   s    

zConnectionTests.test_weakrefc                s   |  j    g   g       f d d   }   j   } t j d |  } | j   d } x] t d  D]O } | j d | f    j   x)   j r  j	 d   j j
   f  q Wqh W j	 d  |  j  d t    d  S)	Nc                  sG   x@  sB   j    x)   j r>  j d   j j   f  q Wq Wd  S)Nr   )commitr*   appendpopr   )r   r*   stopr   r   	committer   s    	
z:ConnectionTests.test_commit_concurrency.<locals>.committerrF   r   i  z
select %s;Tz%d notices raised)r   r   rH   rI   rK   r7   r   r^   r*   r_   r`   r   r-   )r   rb   r!   rL   r9   r   )r   r*   ra   r   test_commit_concurrency   s    	

$z'ConnectionTests.test_commit_concurrencyc             C   s[   d d  l  } |  j d | j j  } | j   } | j d  |  j | j   d d  d  S)Nr   cursor_factoryzselect 1 as aar   )psycopg2.extrasrD   extras
DictCursorr   r   r   rS   )r   r    r   r!   r   r   r   test_connect_cursor_factory   s
    z+ConnectionTests.test_connect_cursor_factoryc             C   s  |  j  |  j j d   |  j j   } | j d  |  j t d d   | j    t j	 j
 |  j _ |  j  |  j j t j	 j
  |  j j   } | j d  |  j  | j   d d  d  |  j _ |  j  |  j j d   |  j j   } | j d  |  j t d d   | j    d  S)Nzselect 1 as ac             S   s   |  d S)Nre   r   )rr   r   r   <lambda>   s    z5ConnectionTests.test_cursor_factory.<locals>.<lambda>re   r   c             S   s   |  d S)Nre   r   )rj   r   r   r   rk      s    )r   r   rd   r   r   r@   	TypeErrorrS   r    rg   rh   )r   r!   r   r   r   test_cursor_factory   s    z#ConnectionTests.test_cursor_factoryc             C   s   |  j    } | j d d   } |  j t |  t j j  |  j  d t j j  } | j d d   } |  j t |  t j j  d  S)Nrd   )rD   r   r   typer    rQ   rg   rh   )r   r   r!   r   r   r   test_cursor_factory_none   s    z(ConnectionTests.test_cursor_factory_nonec                s^   G  f d d   d t  j j      d  } |  j | j d  |  j d | j k d  d  S)Nc                   s%   e  Z d  Z    f d d   Z   S)z>ConnectionTests.test_failed_init_status.<locals>.SubConnectionc                s3   y t    |   j |  Wn t k
 r. Yn Xd  S)N)super__init__	Exception)r   r   )SubConnection	__class__r   r   rq     s    zGConnectionTests.test_failed_init_status.<locals>.SubConnection.__init__)__name__
__module____qualname__rq   r   )rs   )rt   r   rs     s   rs   z0dbname=thereisnosuchdatabasemate password=foobarz&connection failed so it must be closedZfoobarzpassword was not obscured)r    rQ   
connectionr   r   r   )r   cr   )rs   r   test_failed_init_status  s    "z'ConnectionTests.test_failed_init_statusN)ru   rv   rw   r   r   r   r   r   r   r#   r(   r+   r.   r:   r;   r<   rC   rO   rT   rX   r]   rc   ri   rm   ro   rz   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 d d   Z d d   Z	 d d   Z
 d d   Z d S)IsolationLevelsTestCasec             C   s}   t  j |   |  j   } | j   } y | j d  Wn t j k
 rW | j   Yn X| j d  | j   | j	   d  S)Nzdrop table isolevel;z#create table isolevel (id integer);)
r	   setUprD   r   r   r    ProgrammingErrorrollbackr^   r   )r   r   r!   r   r   r   r|     s    
zIsolationLevelsTestCase.setUpc             C   s)   |  j    } |  j | j t j j  d  S)N)rD   r   r$   r    rQ   ISOLATION_LEVEL_READ_COMMITTED)r   r   r   r   r   test_isolation_level!  s    z,IsolationLevelsTestCase.test_isolation_levelc             C   s,   |  j    } |  j | j t j j k  d  S)N)rD   r   encodingr    rQ   	encodings)r   r   r   r   r   test_encoding'  s    z%IsolationLevelsTestCase.test_encodingc             C   s  |  j    } | j   } d  t j j f d t j j f d t j j f d t j j f d t j j f g } x | D] \ } } | j	 |  | j
 d k  r | t j j t j j f k r | | j | | f  d \ } } q n  |  j | j |  | j d  | j   d } | d  k r;| j d	  | j   d } n  |  j | |  | j   qp W|  j t | j	 d  |  j t | j	 d
  d  S)Nzread uncommittedzread committedzrepeatable readserializablei8 r   zshow transaction_isolation;r   z#show default_transaction_isolation;   r6   )rD   r   r    rQ   ISOLATION_LEVEL_AUTOCOMMIT ISOLATION_LEVEL_READ_UNCOMMITTEDr   ISOLATION_LEVEL_REPEATABLE_READISOLATION_LEVEL_SERIALIZABLEr%   r)   indexr   r$   r   rS   r^   r@   
ValueError)r   r   r   Zlevelsnamer'   Zgot_namer   r   r   test_set_isolation_level+  s0    	)z0IsolationLevelsTestCase.test_set_isolation_levelc             C   s  |  j    } | j   } |  j t j j | j    | j d  |  j t j j | j    | j	 t j j
  |  j t j j | j    | j d  |  j d | j   d  | j d  |  j t j j | j    | j	 t j j  |  j t j j | j    | j d  |  j d | j   d  | j d  |  j t j j | j    | j	 t j j  |  j t j j | j    | j d  |  j d | j   d  d  S)Nz!insert into isolevel values (10);zselect count(*) from isolevel;r   r   )rD   r   r   r    rQ   TRANSACTION_STATUS_IDLEget_transaction_statusr   TRANSACTION_STATUS_INTRANSr%   r   rS   r   r   )r   r   r!   r   r   r   test_set_isolation_level_abortO  s>    z6IsolationLevelsTestCase.test_set_isolation_level_abortc             C   s   |  j    } |  j    } | j t j j  | j   } | j d  |  j d | j   d  | j	   | j   } | j d  | j d  |  j d | j   d  d  S)Nzselect count(*) from isolevel;r   z!insert into isolevel values (10);r   )
rD   r%   r    rQ   r   r   r   r   rS   r^   )r   cnn1cnn2cur1cur2r   r   r   test_isolation_level_autocommitt  s    
z7IsolationLevelsTestCase.test_isolation_level_autocommitc             C   sB  |  j    } |  j    } | j t j j  | j   } | j d  |  j d | j   d  | j	   | j   } | j d  | j d  | j d  |  j d | j   d  | j	   | j d  |  j d | j   d  | j d  |  j d | j   d  | j	   | j d  |  j d | j   d  d  S)Nzselect count(*) from isolevel;r   z!insert into isolevel values (10);z!insert into isolevel values (20);r   r   )
rD   r%   r    rQ   r   r   r   r   rS   r^   )r   r   r   r   r   r   r   r   #test_isolation_level_read_committed  s(    


z;IsolationLevelsTestCase.test_isolation_level_read_committedc             C   si  |  j    } |  j    } | j t j j  | j   } | j d  |  j d | j   d  | j	   | j   } | j d  | j d  | j d  |  j d | j   d  | j	   | j d  |  j d | j   d  | j d  |  j d | j   d  | j	   | j d  |  j d | j   d  | j d  |  j d | j   d  d  S)Nzselect count(*) from isolevel;r   z!insert into isolevel values (10);z!insert into isolevel values (20);r   r   )
rD   r%   r    rQ   r   r   r   r   rS   r^   )r   r   r   r   r   r   r   r   !test_isolation_level_serializable  s,    


z9IsolationLevelsTestCase.test_isolation_level_serializablec             C   se   |  j    } | j   |  j t j t | d  |  j t j | j d  |  j t j | j d  d  S)Nr$   r   r   )rD   r   r@   r    InterfaceErrorgetattrr%   )r   rB   r   r   r   test_isolation_level_closed  s    

z3IsolationLevelsTestCase.test_isolation_level_closedN)ru   rv   rw   r|   r   r   r   r   r   r   r   r   r   r   r   r   r{     s   $%r{   c               @   s0  e  Z 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# d$   Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 S)2ConnectionTwoPhaseTestsc             C   s%   t  j |   |  j   |  j   d  S)N)r	   r|   make_test_tableclear_test_xacts)r   r   r   r   r|     s    
zConnectionTwoPhaseTests.setUpc             C   s   |  j    t j |   d  S)N)r   r	   tearDown)r   r   r   r   r     s    
z ConnectionTwoPhaseTests.tearDownc             C   s   |  j    } | j d  | j   } y | j d t f  Wn- t j k
 rk | j   | j   d SYn Xd d   | D } x! | D] } | j d | f  q W| j   d S)z8Rollback all the prepared transaction in the testing db.r   z5select gid from pg_prepared_xacts where database = %sNc             S   s   g  |  ] } | d   q S)r   r   )r2   rj   r   r   r   r4     s   	 z<ConnectionTwoPhaseTests.clear_test_xacts.<locals>.<listcomp>zrollback prepared %s;)	rD   r%   r   r   r   r    r}   r~   r   )r   rB   r!   Zgidsgidr   r   r   r     s    

	z(ConnectionTwoPhaseTests.clear_test_xactsc             C   sp   |  j    } | j   } y | j d  Wn t j k
 rJ | j   Yn X| j d  | j   | j   d  S)NzDROP TABLE test_tpc;z"CREATE TABLE test_tpc (data text);)rD   r   r   r    r}   r~   r^   r   )r   rB   r!   r   r   r   r     s    
z'ConnectionTwoPhaseTests.make_test_tablec             C   sI   |  j    } | j   } | j d t f  | j   d } | j   | S)z=Return the number of prepared xacts currently in the test db.zT
            select count(*) from pg_prepared_xacts
            where database = %s;r   )rD   r   r   r   rS   r   )r   rB   r!   rvr   r   r   count_xacts  s    

z#ConnectionTwoPhaseTests.count_xactsc             C   sC   |  j    } | j   } | j d  | j   d } | j   | S)z/Return the number of records in the test table.zselect count(*) from test_tpc;r   )rD   r   r   rS   r   )r   rB   r!   r   r   r   r   count_test_records  s    
z*ConnectionTwoPhaseTests.count_test_recordsc             C   sG  |  j    } | j d d d  } |  j | j t j j  | j |  |  j | j t j j  | j	   } | j
 d  |  j d |  j    |  j d |  j    | j   |  j | j t j j  |  j d |  j    |  j d |  j    | j   |  j | j t j j  |  j d |  j    |  j d |  j    d  S)Nr   gtridbqualz0insert into test_tpc values ('test_tpc_commit');r   )rD   rA   r   statusr    rQ   STATUS_READY	tpc_beginSTATUS_BEGINr   r   r   r   tpc_prepareSTATUS_PREPARED
tpc_commit)r   rB   rA   r!   r   r   r   test_tpc_commit  s"    

z'ConnectionTwoPhaseTests.test_tpc_commitc             C   s   |  j    } | j d d d  } |  j | j t j j  | j |  |  j | j t j j  | j	   } | j
 d  |  j d |  j    |  j d |  j    | j   |  j | j t j j  |  j d |  j    |  j d |  j    d  S)Nr   r   r   z3insert into test_tpc values ('test_tpc_commit_1p');r   )rD   rA   r   r   r    rQ   r   r   r   r   r   r   r   r   )r   rB   rA   r!   r   r   r   test_tpc_commit_one_phase  s    
z1ConnectionTwoPhaseTests.test_tpc_commit_one_phasec             C   s\  |  j    } | j d d d  } |  j | j t j j  | j |  |  j | j t j j  | j	   } | j
 d  |  j d |  j    |  j d |  j    | j   | j   |  j d |  j    |  j d |  j    |  j    } | j d d d  } | j |  |  j | j t j j  |  j d |  j    |  j d |  j    d  S)Nr   r   r   z4insert into test_tpc values ('test_tpc_commit_rec');r   )rD   rA   r   r   r    rQ   r   r   r   r   r   r   r   r   r   r   )r   rB   rA   r!   r   r   r   test_tpc_commit_recovered-  s&    

z1ConnectionTwoPhaseTests.test_tpc_commit_recoveredc             C   sG  |  j    } | j d d d  } |  j | j t j j  | j |  |  j | j t j j  | j	   } | j
 d  |  j d |  j    |  j d |  j    | j   |  j | j t j j  |  j d |  j    |  j d |  j    | j   |  j | j t j j  |  j d |  j    |  j d |  j    d  S)Nr   r   r   z2insert into test_tpc values ('test_tpc_rollback');r   )rD   rA   r   r   r    rQ   r   r   r   r   r   r   r   r   r   tpc_rollback)r   rB   rA   r!   r   r   r   test_tpc_rollbackG  s"    

z)ConnectionTwoPhaseTests.test_tpc_rollbackc             C   s   |  j    } | j d d d  } |  j | j t j j  | j |  |  j | j t j j  | j	   } | j
 d  |  j d |  j    |  j d |  j    | j   |  j | j t j j  |  j d |  j    |  j d |  j    d  S)Nr   r   r   z5insert into test_tpc values ('test_tpc_rollback_1p');r   )rD   rA   r   r   r    rQ   r   r   r   r   r   r   r   r   )r   rB   rA   r!   r   r   r   test_tpc_rollback_one_phase^  s    
z3ConnectionTwoPhaseTests.test_tpc_rollback_one_phasec             C   s\  |  j    } | j d d d  } |  j | j t j j  | j |  |  j | j t j j  | j	   } | j
 d  |  j d |  j    |  j d |  j    | j   | j   |  j d |  j    |  j d |  j    |  j    } | j d d d  } | j |  |  j | j t j j  |  j d |  j    |  j d |  j    d  S)Nr   r   r   z4insert into test_tpc values ('test_tpc_commit_rec');r   )rD   rA   r   r   r    rQ   r   r   r   r   r   r   r   r   r   r   )r   rB   rA   r!   r   r   r   test_tpc_rollback_recoveredp  s&    

z3ConnectionTwoPhaseTests.test_tpc_rollback_recoveredc             C   s   |  j    } |  j t j j | j  | j   } |  j t j j | j  | j   } | j d  |  j t j j	 | j  | j   } |  j t j j	 | j  d  S)Nzselect 1)
rD   r   r    rQ   r   r   tpc_recoverr   r   r   )r   rB   Zxnsr!   r   r   r   test_status_after_recover  s    z1ConnectionTwoPhaseTests.test_status_after_recoverc       
      C   sA  |  j    } | j d  | j   } | j d  | j d  | j d t f  | j   } | j   |  j    } | j   } d d   | D } | j d t d   |  j	 t
 |  t
 |   xu t | |  D]d \ } \ } } } }	 |  j	 | j |  |  j	 | j |  |  j	 | j |  |  j	 | j |	  q Wd  S)	Nr   z#begin; prepare transaction '1-foo';z#begin; prepare transaction '2-bar';zv
            select gid, prepared, owner, database
            from pg_prepared_xacts
            where database = %s;c             S   s%   g  |  ] } | j  t k r |  q Sr   )databaser   )r2   rA   r   r   r   r4     s   	 z?ConnectionTwoPhaseTests.test_recovered_xids.<locals>.<listcomp>keyr   )rD   r%   r   r   r   Zfetchallsortr   r   r   r-   zipr   preparedownerr   )
r   rB   r!   ZokvalsxidsrA   r   r   r   r   r   r   r   test_recovered_xids  s(    

(z+ConnectionTwoPhaseTests.test_recovered_xidsc             C   s   |  j    } | j d d d  } | j |  | j   |  j    } | j   } | j d t f  |  j d | j   d  d  S)Nr=   r   r   z6select gid from pg_prepared_xacts where database = %s;z42_Z3RyaWQ=_YnF1YWw=r   )	rD   rA   r   r   r   r   r   r   rS   )r   rB   rA   r!   r   r   r   test_xid_encoding  s    
	
z)ConnectionTwoPhaseTests.test_xid_encodingc             C   s  x d d d d d d	 d f g D] \ } } } |  j    } | j | | |  } | j |  | j   | j   |  j    } d
 d   | j   D } |  j d t |   | d } |  j | j |  |  j | j	 |  |  j | j
 |  | j |  q! Wd  S)Nr    r=   r   r   ix@   yc             S   s%   g  |  ] } | j  t k r |  q Sr   )r   r   )r2   rA   r   r   r   r4     s   	 z>ConnectionTwoPhaseTests.test_xid_roundtrip.<locals>.<listcomp>r   )r   r   r   )r=   zgtridzbqual)rD   rA   r   r   r   r   r   r-   	format_idr   r   r   )r   Zfidr   r   rB   rA   r   r   r   r   test_xid_roundtrip  s"    '


z*ConnectionTwoPhaseTests.test_xid_roundtripc             C   s   x d d d d g D] } |  j    } | j |  | j   | j   |  j    } d d   | j   D } |  j d t |   | d } |  j | j d   |  j | j |  |  j | j	 d   | j
 |  q Wd  S)	Nr   zhello, world!r      c             S   s%   g  |  ] } | j  t k r |  q Sr   )r   r   )r2   rA   r   r   r   r4     s   	 zCConnectionTwoPhaseTests.test_unparsed_roundtrip.<locals>.<listcomp>r   r   )rD   r   r   r   r   r   r-   r   r   r   r   )r   tidrB   r   rA   r   r   r   test_unparsed_roundtrip  s     


z/ConnectionTwoPhaseTests.test_unparsed_roundtripc             C   s_   d d l  m } | d d d  } |  j d | j  |  j d | j  |  j d | j  d  S)Nr   )XidJ   r>   r?   )psycopg2.extensionsr   r   r   r   r   )r   r   x1r   r   r   test_xid_construction  s
    z-ConnectionTwoPhaseTests.test_xid_constructionc             C   s   d d l  m } | j d  } |  j d | j  |  j d | j  |  j d | j  | j d  } |  j d  | j  |  j d | j  |  j d  | j  d  S)Nr   )r   z42_Z3RyaWQ=_YnF1YWw=r=   r   r   
99_xxx_yyy)r   r   from_stringr   r   r   r   )r   r   x2Zx3r   r   r   test_xid_from_string  s    z,ConnectionTwoPhaseTests.test_xid_from_stringc             C   s^   d d l  m } | j d  } |  j t |  d  | j d  } |  j t |  d  d  S)Nr   )r   z42_Z3RyaWQ=_YnF1YWw=r   )r   r   r   r   str)r   r   r   r   r   r   r   test_xid_to_string  s
    z*ConnectionTwoPhaseTests.test_xid_to_stringc             C   s   |  j    } | j d d d  } | j |  | j   | j   d d   | j   D d } |  j d | j  |  j d | j  |  j d | j	  d  S)Nr0   unicodec             S   s%   g  |  ] } | j  t k r |  q Sr   )r   r   )r2   rA   r   r   r   r4     s   	 z<ConnectionTwoPhaseTests.test_xid_unicode.<locals>.<listcomp>r   )
rD   rA   r   r   r&   r   r   r   r   r   )r   rB   r   rA   r   r   r   test_xid_unicode  s    

z(ConnectionTwoPhaseTests.test_xid_unicodec             C   s   |  j    } | j d  | j d  | j   | j   d d   | j   D d } |  j d  | j  |  j d | j  |  j d  | j	  d  S)Nutf8ztransaction-idc             S   s%   g  |  ] } | j  t k r |  q Sr   )r   r   )r2   rA   r   r   r   r4   !  s   	 zEConnectionTwoPhaseTests.test_xid_unicode_unparsed.<locals>.<listcomp>r   )
rD   rP   r   r   r&   r   r   r   r   r   )r   rB   rA   r   r   r   test_xid_unicode_unparsed  s    

z1ConnectionTwoPhaseTests.test_xid_unicode_unparsedc             C   s=   |  j    } | j d  | j   |  j t j | j  d  S)Ncancel)rD   r   r   r@   r    r}   r   )r   rB   r   r   r   test_cancel_fails_prepared'  s    
z2ConnectionTwoPhaseTests.test_cancel_fails_preparedc             C   s   d d l  m } |  j d |  } | j d  | j   | j   | j   } d d   | D d } |  j d  | j  |  j d | j	  |  j d  | j
  d  S)Nr   )RealDictConnectionconnection_factoryzdict-connectionc             S   s%   g  |  ] } | j  t k r |  q Sr   )r   r   )r2   rA   r   r   r   r4   5  s   	 zQConnectionTwoPhaseTests.test_tpc_recover_non_dbapi_connection.<locals>.<listcomp>)rf   r   rD   r   r   r&   r   r   r   r   r   )r   r   rB   r   rA   r   r   r   %test_tpc_recover_non_dbapi_connection-  s    

z=ConnectionTwoPhaseTests.test_tpc_recover_non_dbapi_connectionN)ru   rv   rw   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s0   		r   c               @   s   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 e
 d d  d d    Z e d d  d d    Z d S)TransactionControlTestsc             C   s3   |  j  j   |  j t j |  j  j t j j  d  S)N)r   r   r@   r    r   set_sessionrQ   r   )r   r   r   r   test_closed?  s    	z#TransactionControlTests.test_closedc             C   sB   |  j  j   } | j d  |  j t j |  j  j t j j  d  S)Nzselect 1)	r   r   r   r@   r    r}   r   rQ   r   )r   r!   r   r   r   test_not_in_transactionE  s
    	z/TransactionControlTests.test_not_in_transactionc             C   s  |  j  j   } |  j  j t j j  | j d  |  j | j   d d  |  j  j	   |  j  j t j j
  | j d  |  j  j d k r |  j | j   d d  n |  j | j   d d  |  j  j	   |  j  j d t j j  | j d  |  j | j   d d  |  j  j	   |  j  j d t j j  | j d  |  j  j d k rt|  j | j   d d  n |  j | j   d d  |  j  j	   d  S)	Nz#SHOW default_transaction_isolation;r   r   i8 zrepeatable readr$   zread committedzread uncommitted)r   r   r   r    rQ   r   r   r   rS   r~   r   r)   r   r   )r   r!   r   r   r   r   L  s2    		z0TransactionControlTests.test_set_isolation_levelc             C   s  |  j  j   } |  j  j d  | j d  |  j | j   d d  |  j  j   |  j  j d  | j d  |  j  j d k r |  j | j   d d  n |  j | j   d d  |  j  j   |  j  j d  | j d  |  j | j   d d  |  j  j   |  j  j d  | j d  |  j  j d k rV|  j | j   d d  n |  j | j   d d  |  j  j   d  S)Nr   z#SHOW default_transaction_isolation;r   zrepeatable readi8 zread committedzread uncommitted)r   r   r   r   r   rS   r~   r)   )r   r!   r   r   r   test_set_isolation_level_strl  s*    z4TransactionControlTests.test_set_isolation_level_strc             C   sO   |  j  t |  j j d  |  j  t |  j j d  |  j  t |  j j d  d  S)Nr   r   Zwhatever)r@   r   r   r   )r   r   r   r   test_bad_isolation_level  s    z0TransactionControlTests.test_bad_isolation_levelc             C   s+  |  j  j   } |  j  j d d  | j d  |  j | j   d d  |  j  j   | j d  |  j | j   d d  |  j  j   |  j  j   } |  j  j d d   | j d  |  j | j   d d  |  j  j   |  j  j d d  | j d  |  j | j   d d  |  j  j   d  S)NreadonlyTz#SHOW default_transaction_read_only;r   onFoff)r   r   r   r   r   rS   r~   )r   r!   r   r   r   test_set_read_only  s"    z*TransactionControlTests.test_set_read_onlyc             C   s   |  j  j   } | j d  | j   d } | j d  | j   d } |  j  j   |  j  j d d d d  |  j  j d d d d  | j d  |  j | j   d |  | j d  |  j | j   d |  d  S)	Nz#SHOW default_transaction_isolation;r   z#SHOW default_transaction_read_only;r$   r   r   Tdefault)r   r   r   rS   r~   r   r   )r   r!   Zdefault_isolevelZdefault_readonlyr   r   r   test_set_default  s    z(TransactionControlTests.test_set_default	   r   c             C   s)  |  j  j   } |  j  j d d d d  | j d  |  j | j   d d  | j d  |  j | j   d d  |  j  j   | j d  |  j | j   d d  |  j  j   |  j  j d d  | j d  |  j | j   d d  | j d  |  j | j   d d	  |  j  j   d  S)
Nr   T
deferrablez#SHOW default_transaction_read_only;r   r   z$SHOW default_transaction_deferrable;Fr   )r   r   r   r   r   rS   r~   )r   r!   r   r   r   test_set_deferrable  s     z+TransactionControlTests.test_set_deferrablec             C   s)   |  j  t j |  j j d d d d d  S)Nr   Tr   )r@   r    r}   r   r   )r   r   r   r   test_set_deferrable_error  s    z1TransactionControlTests.test_set_deferrable_errorN)ru   rv   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   >  s    r   c               @   sL   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d S)AutocommitTestsc             C   se   |  j  j   |  j t j t |  j  d d  y |  j |  j  j d k  Wn t j k
 r` Yn Xd  S)N
autocommitTF)TF)r   r   r@   r    r   setattrr   r   )r   r   r   r   r     s    zAutocommitTests.test_closedc             C   s   |  j  |  j j  |  j |  j j t j j  |  j |  j j   t j j	  |  j j
   } | j d  |  j |  j j t j j  |  j |  j j   t j j  |  j j   |  j |  j j t j j  |  j |  j j   t j j	  d  S)Nz	select 1;)r   r   r   r   r   r    rQ   r   r   r   r   r   r   r   r~   )r   r!   r   r   r   test_default_no_autocommit  s    z*AutocommitTests.test_default_no_autocommitc             C   sX  d |  j  _ |  j |  j  j  |  j |  j  j t j j  |  j |  j  j   t j j	  |  j  j
   } | j d  |  j |  j  j t j j  |  j |  j  j   t j j	  d |  j  _ |  j |  j  j  |  j |  j  j t j j  |  j |  j  j   t j j	  | j d  |  j |  j  j t j j  |  j |  j  j   t j j  d  S)NTz	select 1;F)r   r   r   r   r   r    rQ   r   r   r   r   r   r   r   )r   r!   r   r   r   test_set_autocommit  s&    z#AutocommitTests.test_set_autocommitc             C   s?   |  j  j   } | j d  |  j t j t |  j  d d  d  S)Nz	select 1;r   T)r   r   r   r@   r    r}   r   )r   r!   r   r   r   test_set_intrans_error  s    z&AutocommitTests.test_set_intrans_errorc             C   s8  |  j  j d d  |  j |  j  j  |  j |  j  j t j j  |  j |  j  j	   t j j
  |  j  j   } | j d  |  j |  j  j t j j  |  j |  j  j	   t j j
  |  j  j d d  |  j |  j  j  |  j |  j  j t j j  |  j |  j  j	   t j j
  | j d  |  j |  j  j t j j  |  j |  j  j	   t j j  |  j  j   |  j  j d d d d d |  j |  j  j  | j d  |  j |  j  j t j j  |  j |  j  j	   t j j
  | j d  |  j | j   d d  | j d	  |  j | j   d d
  d  S)Nr   Tz	select 1;Fr   r   z#SHOW default_transaction_isolation;r   z#SHOW default_transaction_read_only;r   )r   r   r   r   r   r   r    rQ   r   r   r   r   r   r   r   r~   rS   )r   r!   r   r   r   test_set_session_autocommit	  s<    z+AutocommitTests.test_set_session_autocommitN)ru   rv   rw   r   r   r   r   r   r   r   r   r   r     s
   r   c               C   s   t  j   j t  S)N)r   Z
TestLoaderZloadTestsFromNameru   r   r   r   r   
test_suite.  s    r   __main__)rU   rJ   rH   operatorr   r    Zpsycopg2.errorcodesr   Z	testutilsr   r   r   r   r   r	   r
   r   Z
testconfigr   r   r   r{   r   r   r   r   ru   mainr   r   r   r   <module>   s*    vb