B
    18\\                 @   sJ  d Z ddlZddlZddlZddlZddlmZ yddlZW n ek
rT   dZY nX ddlZddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ eedkd
G dd dejZG dd dejZeedkd
G dd deejZeedkd
eeeddG dd deejZedkrFe  dS )zTests for asyncio/sslproto.py.    N)mock)log)	protocols)sslproto)tasks)utils)
functionalzNo ssl modulec                   s   e Zd Z fddZddd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  ZS )SslProtoHandshakeTestsc                s$   t    t | _| | j d S )N)supersetUpasyncionew_event_looploopset_event_loop)self)	__class__ c/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_asyncio/test_sslproto.pyr      s    

zSslProtoHandshakeTests.setUpN)waiterprotoc            C   sR   t  }|d krt }tj| j|||dd}| |j	 | | 
|jj |S )Ng?)ssl_handshake_timeout)
test_utilsdummy_ssl_contextr   Protocolr   SSLProtocolr   assertIs_app_transportget_protocol
addCleanupclose)r   r   r   
sslcontext	ssl_protor   r   r   ssl_protocol   s    z#SslProtoHandshakeTests.ssl_protocol)do_handshakec         	   C   s^   t  }t  }d|j_|r&||j_ndd }||j_t jd|d || W d Q R X |S )N    c             S   s   g S )Nr   )callbackr   r   r   mock_handshake/   s    z>SslProtoHandshakeTests.connection_made.<locals>.mock_handshakezasyncio.sslproto._SSLPipe)return_value)r   Mockshutdownr'   r#   side_effectpatchconnection_made)r   r!   r#   	transportZsslpiper&   r   r   r   r,   (   s    
z&SslProtoHandshakeTests.connection_madec          	   C   sJ   t  }t }t }| td tj| j|||dd W d Q R X d S )Nza positive numberr   )r   )	r   r   r   r(   assertRaisesRegex
ValueErrorr   r   r   )r   r    	app_protor   r   r   r   test_handshake_timeout_zero6   s    z2SslProtoHandshakeTests.test_handshake_timeout_zeroc          	   C   sJ   t  }t }t }| td tj| j|||dd W d Q R X d S )Nza positive numberi)r   )	r   r   r   r(   r.   r/   r   r   r   )r   r    r0   r   r   r   r   test_handshake_timeout_negative>   s    z6SslProtoHandshakeTests.test_handshake_timeout_negativec             C   sL   t j| jd}| j|d}| | |  t| j | |	 t
 d S )N)r   )r   )r   Futurer   r"   r,   eof_receivedr   run_brieflyassertIsInstance	exceptionConnectionResetError)r   r   r!   r   r   r   test_eof_received_waiterF   s    
z/SslProtoHandshakeTests.test_eof_received_waiterc          	   C   sT   t j| jd}| j|d}tj }tjtj	 z|
d  W d tj| X d S )N)r   )r   )r   r3   r   r"   r   loggergetEffectiveLevelsetLevelloggingFATAL_fatal_error)r   r   r!   Z	log_levelr   r   r   test_fatal_error_no_name_errorN   s    
z5SslProtoHandshakeTests.test_fatal_error_no_name_errorc             C   sN   t j| jd}| j|d}| | |t t| j | 	|
 t d S )N)r   )r   )r   r3   r   r"   r,   connection_lostConnectionAbortedErrorr   r5   r6   r7   )r   r   r!   r   r   r   test_connection_lost]   s    

z+SslProtoHandshakeTests.test_connection_lostc             C   sL   t j| jd}| j|d}| |}t| j |j  | 	|j
j d S )N)r   )r   )r   r3   r   r"   r,   r   r5   r   r   
assertTrueabortcalled)r   r   r!   r-   r   r   r   test_close_during_handshakeg   s    

z2SslProtoHandshakeTests.test_close_during_handshakec             C   s|   t j| jd}| j|d}| |d t }| |d|| | | | 	|d |
d  | |d d S )N)r   )r   socket)r   r3   r   r"   assertIsNone_get_extra_infoobjectr   r,   assertIsNotNonerA   )r   r   r!   defaultr   r   r   (test_get_extra_info_on_closed_connectionr   s    

z?SslProtoHandshakeTests.test_get_extra_info_on_closed_connectionc             C   sR   t j| jd}| j|d}t  }|j| | |j | | |j	| d S )N)r   )r   )
r   r3   r   r"   r   r   set_protocolr   r   _app_protocol)r   r   r!   Znew_app_protor   r   r   test_set_new_app_protocol}   s    z0SslProtoHandshakeTests.test_set_new_app_protocolc             C   s4   |   }| | |j}|  | |d d S )Ns   data)r"   r,   r   r   rI   data_received)r   r!   transpr   r   r    test_data_received_after_closing   s
    
z7SslProtoHandshakeTests.test_data_received_after_closingc             C   s4   |   }| | |j}|  | |d d S )Ns   data)r"   r,   r   r   rI   write)r   r!   rS   r   r   r   test_write_after_closing   s
    
z/SslProtoHandshakeTests.test_write_after_closing)__name__
__module____qualname__r   r"   r,   r1   r2   r9   r@   rC   rG   rN   rQ   rT   rV   __classcell__r   r   )r   r   r	      s   


r	   c               @   sl   e Zd Zd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S )BaseStartTLSi  <   c             C   s   t d S )N)NotImplementedError)r   r   r   r   new_loop   s    zBaseStartTLS.new_loopc          
   C   s  G dd dt j}xdD ]}|d|}t|d | |jd |d|}t|d | |jd |d|}t|d | |jd |d|}t|d | |jd |d	|}t|d | |jd |d
|}| td t|d W d Q R X qW d S )Nc               @   s$   e Zd Zdd Zdd Zdd ZdS )z.BaseStartTLS.test_buf_feed_data.<locals>.Protoc             S   s&   t || _t| j| _d| _|| _d S )Nr$   )	bytearraybuf
memoryviewmvdatausemv)r   bufsizerd   r   r   r   __init__   s    
z7BaseStartTLS.test_buf_feed_data.<locals>.Proto.__init__c             S   s   | j r| jS | jS d S )N)rd   rb   r`   )r   sizehintr   r   r   
get_buffer   s    z9BaseStartTLS.test_buf_feed_data.<locals>.Proto.get_bufferc             S   s<   | j r |  j| jd | 7  _n|  j| jd | 7  _d S )N)rd   rc   rb   r`   )r   nsizer   r   r   buffer_updated   s    z=BaseStartTLS.test_buf_feed_data.<locals>.Proto.buffer_updatedN)rW   rX   rY   rf   rh   rj   r   r   r   r   Proto   s   rk   )FT   s   12345   s   1234   d   r   zempty buffer)r   BufferedProtocolr   _feed_data_to_buffered_protoassertEqualrc   r.   RuntimeError)r   rk   rd   r   r   r   r   test_buf_feed_data   s(    






zBaseStartTLS.test_buf_feed_datac          	      s   dj  t t fdd}G fdddtj  fdd}j|jd&}j	tj
||jjd	d
 W d Q R X d S )N   1c                s   |  j | t }t|t  | jdd | d | t }t|t  | tj	 | 
  d S )NT)server_side   O)
settimeoutTIMEOUTrecv_alllenrr   	start_tlssendallr)   rH   	SHUT_RDWRr   )sockrc   )	HELLO_MSGr   server_contextr   r   serve   s    
z=BaseStartTLS.test_start_tls_client_reg_proto_1.<locals>.servec                   s0   e Zd Zdd Z fddZdd Zdd Zd	S )
zCBaseStartTLS.test_start_tls_client_reg_proto_1.<locals>.ClientProtoc             S   s   || _ || _d| _d S )Nr   )on_dataon_eofcon_made_cnt)r   r   r   r   r   r   rf      s    zLBaseStartTLS.test_start_tls_client_reg_proto_1.<locals>.ClientProto.__init__c                s    |  j d7  _  | j d d S )Nrl   )r   rr   )r   tr)r   r   r   r,      s    zSBaseStartTLS.test_start_tls_client_reg_proto_1.<locals>.ClientProto.connection_madec             S   s   | j | d S )N)r   
set_result)r   rc   r   r   r   rR      s    zQBaseStartTLS.test_start_tls_client_reg_proto_1.<locals>.ClientProto.data_receivedc             S   s   | j d d S )NT)r   r   )r   r   r   r   r4      s    zPBaseStartTLS.test_start_tls_client_reg_proto_1.<locals>.ClientProto.eof_receivedN)rW   rX   rY   rf   r,   rR   r4   r   )r   r   r   ClientProto   s   r   c                s   t jdjdI d H  j  j jj fddf|  I d H \}}| j||I d H } I d H d | I d H  |  d S )Ng      ?)r   c                  s
    S )Nr   r   )r   r   r   r   r   <lambda>  r$   zPBaseStartTLS.test_start_tls_client_reg_proto_1.<locals>.client.<locals>.<lambda>rw   )	r   sleepr   create_futurecreate_connectionrU   r|   rr   r   )addrr   r   new_tr)r   r   client_contextr   )r   r   r   client   s    

"


z>BaseStartTLS.test_start_tls_client_reg_proto_1.<locals>.client)timeout
   )r   r   )PAYLOAD_SIZEr   simple_server_sslcontextsimple_client_sslcontextr   r   
tcp_serverry   r   run_until_completewait_forr   )r   r   r   srvr   )r   r   r   r   r   r   !test_start_tls_client_reg_proto_1   s    
z.BaseStartTLS.test_start_tls_client_reg_proto_1c          	      s   dj  t t dfdd}G fdddtj G fdddtj fd	d
}j|jd(}j	
tj||jj	jd W d Q R X d S )Nru   r   c                s   |  j | t }t|t  | jdd | d | t }t|t  | d | t }t|t  | tj	 | 
  d S )NT)rv   rw      2)rx   ry   rz   r{   rr   r|   r}   r)   rH   r~   r   )r   rc   )r   r   r   r   r   r     s    

z=BaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.servec                   s0   e Zd Zdd Z fddZdd Zdd Zd	S )
zHBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoFirstc             S   s   || _ td| _d S )Nrl   )r   r_   r`   )r   r   r   r   r   rf   ,  s    zQBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoFirst.__init__c                s    d7  d S )Nrl   r   )r   r   )client_con_made_callsr   r   r,   0  s    zXBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoFirst.connection_madec             S   s   | j S )N)r`   )r   rg   r   r   r   rh   4  s    zSBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoFirst.get_bufferc             S   s*   |dkst | jt| jd |  d S )Nrl   )AssertionErrorr   r   bytesr`   )r   ri   r   r   r   rj   7  s    zWBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoFirst.buffer_updatedN)rW   rX   rY   rf   r,   rh   rj   r   )r   r   r   ClientProtoFirst+  s   r   c                   s0   e Zd Zdd Z fddZdd Zdd Zd	S )
zIBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoSecondc             S   s   || _ || _d| _d S )Nr   )r   r   r   )r   r   r   r   r   r   rf   <  s    zRBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoSecond.__init__c                s    d7  d S )Nrl   r   )r   r   )r   r   r   r,   A  s    zYBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoSecond.connection_madec             S   s   | j | d S )N)r   r   )r   rc   r   r   r   rR   E  s    zWBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoSecond.data_receivedc             S   s   | j d d S )NT)r   r   )r   r   r   r   r4   H  s    zVBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.ClientProtoSecond.eof_receivedN)rW   rX   rY   rf   r,   rR   r4   r   )r   r   r   ClientProtoSecond;  s   r   c                s   t jdjdI d H  j  j }j }jj fddf|  I d H \}}| j||I d H } I d H d | ||| |I d H d | |I d H  |	  d d S )Ng      ?)r   c                  s    S )Nr   r   )r   on_data1r   r   r   S  r$   zPBaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.client.<locals>.<lambda>rw   r   rl   )
r   r   r   r   r   rU   r|   rr   rO   r   )r   Zon_data2r   r   r   r   )r   r   r   r   r   r   )r   r   r   K  s     


 



z>BaseStartTLS.test_start_tls_client_buf_proto_1.<locals>.client)r   )r   r   )r   r   r   r   r   rp   r   r   ry   r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   !test_start_tls_client_buf_proto_1  s    
z.BaseStartTLS.test_start_tls_client_buf_proto_1c          	      s   dj  t j fdd}G fdddtj  fdd}j|jd&}j	tj
||jjd	d
 W d Q R X d S )Nru   c                sv   |  j | t }t|t  z8yjjd  | d}W n tk
rb   Y nX W d | 	  X d S )Ni   )
rx   ry   rz   r{   rr   r   call_soon_threadsafer   rB   r   )r   rc   )r   r   server_waits_on_handshaker   r   r   r  s    

z=BaseStartTLS.test_start_tls_slow_client_cancel.<locals>.servec                   s0   e Zd Zdd Z fddZdd Zdd Zd	S )
zCBaseStartTLS.test_start_tls_slow_client_cancel.<locals>.ClientProtoc             S   s   || _ || _d| _d S )Nr   )r   r   r   )r   r   r   r   r   r   rf     s    zLBaseStartTLS.test_start_tls_slow_client_cancel.<locals>.ClientProto.__init__c                s    |  j d7  _  | j d d S )Nrl   )r   rr   )r   r   )r   r   r   r,     s    zSBaseStartTLS.test_start_tls_slow_client_cancel.<locals>.ClientProto.connection_madec             S   s   | j | d S )N)r   r   )r   rc   r   r   r   rR     s    zQBaseStartTLS.test_start_tls_slow_client_cancel.<locals>.ClientProto.data_receivedc             S   s   | j d d S )NT)r   r   )r   r   r   r   r4     s    zPBaseStartTLS.test_start_tls_slow_client_cancel.<locals>.ClientProto.eof_receivedN)rW   rX   rY   rf   r,   rR   r4   r   )r   r   r   r     s   r   c          	      s   t jdjdI d H  j  j jj fddf|  I d H \}}| I d H  t j* t jj	||djdI d H  W d Q R X d S )Ng      ?)r   c                  s
    S )Nr   r   )r   r   r   r   r   r     r$   zPBaseStartTLS.test_start_tls_slow_client_cancel.<locals>.client.<locals>.<lambda>)
r   r   r   r   r   rU   assertRaisesTimeoutErrorr   r|   )r   r   r   )r   r   r   r   r   )r   r   r   r     s    

"

z>BaseStartTLS.test_start_tls_slow_client_cancel.<locals>.client)r   r   )r   r   )r   r   r   r   r   r   r   r   ry   r   r   r   )r   r   r   r   r   )r   r   r   r   r   r   !test_start_tls_slow_client_cancell  s    

z.BaseStartTLS.test_start_tls_slow_client_cancelc                s   dj   t t tjdr6 jtj	O  _ fddG dd dt
j fddfd	d
}j|  d S )Nru   freebsdc                sd   |  j | | | t }t|t  |  |   | t	j
 |   d S )N)rx   ry   connectrz   r{   rr   r|   r}   r)   rH   r~   r   )r   r   rc   )r   r   r   r   r   r     s    


z4BaseStartTLS.test_start_tls_server_1.<locals>.clientc               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )z9BaseStartTLS.test_start_tls_server_1.<locals>.ServerProtoc             S   s   || _ || _|| _d| _d S )Nr$   )on_conr   on_con_lostrc   )r   r   r   r   r   r   r   rf     s    zBBaseStartTLS.test_start_tls_server_1.<locals>.ServerProto.__init__c             S   s   | j | d S )N)r   r   )r   r   r   r   r   r,     s    zIBaseStartTLS.test_start_tls_server_1.<locals>.ServerProto.connection_madec             S   s   |  j |7  _ d S )N)rc   )r   rc   r   r   r   rR     s    zGBaseStartTLS.test_start_tls_server_1.<locals>.ServerProto.data_receivedc             S   s   | j d d S )Nrl   )r   r   )r   r   r   r   r4     s    zFBaseStartTLS.test_start_tls_server_1.<locals>.ServerProto.eof_receivedc             S   s&   |d kr| j d  n| j | d S )N)r   r   set_exception)r   excr   r   r   rA     s    zIBaseStartTLS.test_start_tls_server_1.<locals>.ServerProto.connection_lostN)rW   rX   rY   rf   r,   rR   r4   rA   r   r   r   r   ServerProto  s
   r   c                sn   |I d H }|   | jd jj|| djdI d H }|I d H  |I d H  | j  |  d S )Nr$   T)rv   r   )rU   rr   rc   r   r|   ry   r   )r   r   r   r   r   r   )r   r   r   r   r   main  s    



z2BaseStartTLS.test_start_tls_server_1.<locals>.mainc           	      s   j  } j  }j  }| ||j fddddI d H }|jd   j fddjd* tj| ||j jdI d H  W d Q R X |	  |
 I d H  d S )Nc                  s    S )Nr   r   )r   r   r   r     r$   zHBaseStartTLS.test_start_tls_server_1.<locals>.run_main.<locals>.<lambda>z	127.0.0.1r   c                s
   |  S )Nr   )r   )r   r   r   r   r     r$   )r   )r   r   )r   r   create_serversocketsgetsockname
tcp_clientry   r   r   r   wait_closed)r   r   r   server)r   r   r   r   )r   r   r   run_main  s    


z6BaseStartTLS.test_start_tls_server_1.<locals>.run_main)r   r   r   r   sysplatform
startswithoptionssslZOP_NO_TLSv1_3r   r   r   r   )r   r   r   )r   r   r   r   r   r   r   r   test_start_tls_server_1  s    
z$BaseStartTLS.test_start_tls_server_1c                s    fdd} j |  d S )Nc           	      sh     td  jd d d I d H  W d Q R X t }   td  jd d | I d H  W d Q R X d S )NzSSLContext, gotzis not supported)r.   	TypeErrorr   r|   r   r   )sslctx)r   r   r   r     s
     z4BaseStartTLS.test_start_tls_wrong_args.<locals>.main)r   r   )r   r   r   )r   r   test_start_tls_wrong_args  s    z&BaseStartTLS.test_start_tls_wrong_argsc          
      s   t   g jfdd dfdd} fdd}j|ddd	0}tj j||j	 W d Q R X W d Q R X 
 g  d S )
Nc                s
     |S )N)append)r   ctx)messagesr   r   r     r$   z5BaseStartTLS.test_handshake_timeout.<locals>.<lambda>Fc                s<   z,y|  d W n tk
r(   d Y nX W d |   X d S )Ni   T)rz   rB   r   )r   )server_side_abortedr   r   r     s
    z3BaseStartTLS.test_handshake_timeout.<locals>.serverc                s6   t jjjt jf|  ddddjdI d H  d S )N g      $@)r   server_hostnamer   g      ?)r   )r   r   r   r   r   )r   )client_sslctxr   r   r   r     s    z3BaseStartTLS.test_handshake_timeout.<locals>.clientrl   )max_clientsbacklog)r   r   r   set_exception_handlerr   r   r   r   r   r   rD   rr   )r   r   r   r   r   )r   r   r   r   r   test_handshake_timeout  s    	
&
z#BaseStartTLS.test_handshake_timeoutc          
      s   t   g jfdd dd } fdd}j|ddd0}td	 j||j W d Q R X W d Q R X 	g  d S )
Nc                s
     |S )N)r   )r   r   )r   r   r   r   7  r$   zHBaseStartTLS.test_create_connection_ssl_slow_handshake.<locals>.<lambda>c             S   s8   z(y|  d W n tk
r$   Y nX W d |   X d S )Ni   )rz   rB   r   )r   r   r   r   r   9  s
    
zFBaseStartTLS.test_create_connection_ssl_slow_handshake.<locals>.serverc                s&   t j|  djddI d H \}}d S )Nr   g      ?)r   r   r   r   )r   open_connectionr   )r   readerwriter)r   r   r   r   r   A  s    zFBaseStartTLS.test_create_connection_ssl_slow_handshake.<locals>.clientrl   )r   r   zSSL handshake.*is taking longer)
r   r   r   r   r   r.   rB   r   r   rr   )r   r   r   r   r   )r   r   r   r   )test_create_connection_ssl_slow_handshake3  s    
&z6BaseStartTLS.test_create_connection_ssl_slow_handshakec          
      s   j dd  t tjdd fdd} fdd}j|d	d	d
0}tj j 	||j
 W d Q R X W d Q R X d S )Nc             S   s   d S )Nr   )r   r   r   r   r   r   V  r$   zLBaseStartTLS.test_create_connection_ssl_failed_certificate.<locals>.<lambda>F)disable_verifyc                sP   z@y| j  dd W n( tjk
r*   Y n tk
r<   Y nX W d |   X d S )NT)rv   )r|   r   SSLErrorOSErrorr   )r   )r   r   r   r   \  s    
zJBaseStartTLS.test_create_connection_ssl_failed_certificate.<locals>.serverc                s&   t j|  djddI d H \}}d S )Nr   g      ?)r   r   r   r   )r   r   r   )r   r   r   )r   r   r   r   r   h  s    zJBaseStartTLS.test_create_connection_ssl_failed_certificate.<locals>.clientrl   )r   r   )r   r   r   r   r   r   r   r   ZSSLCertVerificationErrorr   r   )r   r   r   r   r   )r   r   r   r   -test_create_connection_ssl_failed_certificateU  s    
z:BaseStartTLS.test_create_connection_ssl_failed_certificatec          	      sx   j dd  t t  fdd} fdd}j|ddd}j ||j}W d Q R X |d	 d S )
Nc             S   s   d S )Nr   )r   r   r   r   r   r   x  r$   zBBaseStartTLS.test_start_tls_client_corrupted_ssl.<locals>.<lambda>c                sl   |   }zLy0| j dd | d | d |d W n tjk
rP   Y nX W d |  |   X d S )NT)rv   s   A
rl   s!   please corrupt the SSL connection)dupr|   r}   rz   sendr   r   r   )r   Z	orig_sock)r   r   r   r   }  s    


z@BaseStartTLS.test_start_tls_client_corrupted_ssl.<locals>.serverc          	      sr   t j|  djdI d H \}}| I d H d |d tj | I d H  W d Q R X |	  dS )Nr   )r   r   r   s   A
   BOK)
r   r   r   rr   readlinerU   r   r   r   r   )r   r   r   )r   r   r   r   r     s    
z@BaseStartTLS.test_start_tls_client_corrupted_ssl.<locals>.clientrl   )r   r   r   )	r   r   r   r   r   r   r   r   rr   )r   r   r   r   resr   )r   r   r   r   #test_start_tls_client_corrupted_sslw  s    
z0BaseStartTLS.test_start_tls_client_corrupted_sslN)rW   rX   rY   r   ry   r^   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r[      s   /<[=T+""r[   c               @   s   e Zd Zdd ZdS )SelectorStartTLSTestsc             C   s   t  S )N)r   SelectorEventLoop)r   r   r   r   r^     s    zSelectorStartTLSTests.new_loopN)rW   rX   rY   r^   r   r   r   r   r     s   r   ProactorEventLoopzWindows onlyc               @   s   e Zd Zdd ZdS )ProactorStartTLSTestsc             C   s   t  S )N)r   r   )r   r   r   r   r^     s    zProactorStartTLSTests.new_loopN)rW   rX   rY   r^   r   r   r   r   r     s   r   __main__)__doc__r=   rH   r   unittestr   r   ImportErrorr   r   r   r   r   Ztest.test_asyncior   r   r   
func_testsskipIfTestCaser	   FunctionalTestCaseMixinr[   r   
skipUnlesshasattrr   rW   r   r   r   r   r   <module>   s>   

     

