U
    luft  ã                   @   s€   d dl Z d dlZd dlmZ d dlmZmZmZmZmZ erFej	ej
_G dd„ deƒZer|d dlZd dlZG dd„ deeƒZdS )é    N)Údevices)ÚPYPYÚBaseZMQTestCaseÚ	GreenTestÚSkipTestÚhave_geventc                   @   sL   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S )Ú
TestDevicec                 C   s<   t jt jt jfD ]&}t |t jt j¡}|j|ks4t‚~qd S )N)	ÚzmqZSTREAMERZ	FORWARDERÚQUEUEr   ÚDeviceZPAIRÚdevice_typeÚAssertionError)ÚselfZdevtypeÚdev© r   ú9/tmp/pip-unpacked-wheel-h6ekxre8/zmq/tests/test_device.pyÚtest_device_types   s    zTestDevice.test_device_typesc                 C   sX   t  tjtjtj¡}|jtjks$t‚|jtjks4t‚|j	tjksDt‚|j
dksRt‚~d S )NT)r   r   r	   r
   ZSUBZPUBZin_typer   Zout_typer   Údaemon)r   r   r   r   r   Útest_device_attributes   s    z!TestDevice.test_device_attributesc                 C   s  t  ¡ dkrtdt  ¡  ƒ‚t t jt jd¡}| j t j	¡}| 
d¡}| d| ¡ | ¡  t d¡ d}| |¡ ||  |¡ks†t‚~| ¡  t t jt jd¡}| j t j	¡}| 
d¡}| d| ¡ | ¡  t d¡ d}| |¡ ||  |¡ksút‚~| ¡  d S ©	N)z4.1.1z4.0.6z%libzmq-%s broke single-socket deviceséÿÿÿÿútcp://127.0.0.1útcp://127.0.0.1:%iç      Ð?ó   hellos   hello again)r	   Úzmq_versionr   r   ÚThreadDevicer
   ÚREPÚcontextÚsocketÚREQÚbind_to_random_portZ
connect_inÚstartÚtimeÚsleepÚsendÚrecvr   ÚcloseZconnect_out)r   r   ÚreqÚportÚmsgr   r   r   Ú$test_single_socket_forwarder_connect   s0    





z/TestDevice.test_single_socket_forwarder_connectc                 C   s  t  ¡ dkrtdt  ¡  ƒ‚t t jt jd¡}| d¡}| j 	t j
¡}| d| ¡ | ¡  t d¡ d}| |¡ ||  |¡ks†t‚~| ¡  t t jt jd¡}| d¡}| j 	t j
¡}| d| ¡ | ¡  t d¡ d}| |¡ ||  |¡ksút‚~| ¡  d S r   )r	   r   r   r   r   r
   r   Úbind_in_to_random_portr   r   r    Úconnectr"   r#   r$   r%   r&   r   r'   )r   r   r)   r(   r*   r   r   r   Ú!test_single_socket_forwarder_bind8   s0    





z,TestDevice.test_single_socket_forwarder_bindc                 C   st   t  tjtjd¡}d}g }d\}}| |j|||d|j|||dg¡ |D ]"}||k s`||krL|  d| ¡ qLd S )Nr   r   ©iˆ  iº  ©Zmin_portZmax_portúUnexpected port number: %i)	r   r   r	   ÚPULLÚPUSHÚextendr,   Úbind_out_to_random_portÚfail©r   r   ÚifaceZportsÚminÚmaxr)   r   r   r   Ú$test_device_bind_to_random_with_argsR   s    þÿz/TestDevice.test_device_bind_to_random_with_argsc              
   C   sr   t  tjtjd¡}d}z"tdƒD ]}|j|ddd q W n* tjk
rb } z
W Y ¢d S d }~X Y nX |  d¡ d S )Nr   r   é   i'  i'  r0   zShould have failed)	r   r   r	   r2   r3   Úranger,   ZZMQBindErrorr6   )r   r   r8   ÚiÚer   r   r   Ú$test_device_bind_to_random_binderrora   s    z/TestDevice.test_device_bind_to_random_binderrorc           
      C   s  t  ¡ dk rtdƒ‚t t jt jt j¡}d}| |¡}| |¡}| 	|¡}| 
¡  t d¡ d}| j t j¡}| d||f ¡ | j t j¡}| d||f ¡ | j t j¡}	|	 d||f ¡ | |¡ | j |||	g¡ ||  |¡ksît‚||  |	¡kst‚d S )N©é   é   úProxies only in libzmq >= 3r   r   r   z%s:%i)r	   Úzmq_version_infor   r   ÚThreadProxyr2   r3   r,   r5   Úbind_mon_to_random_portr"   r#   r$   r   r   r-   r%   Úsocketsr4   r&   r   )
r   r   r8   r)   Zport2Zport3r*   ÚpushÚpullÚmonr   r   r   Ú
test_proxyl   s(    




zTestDevice.test_proxyc              	   C   s˜   t  ¡ dk rtdƒ‚t t jt jt j¡}d}g }d\}}| |j|||d|j	|||d|j
|||dg¡ |D ]"}||k s„||krp|  d| ¡ qpd S )NrA   rD   r   r/   r0   r1   )r	   rE   r   r   rF   r2   r3   r4   r,   r5   rG   r6   r7   r   r   r   Ú#test_proxy_bind_to_random_with_args‚   s    ýÿz.TestDevice.test_proxy_bind_to_random_with_argsN)Ú__name__Ú
__module__Ú__qualname__r   r   r+   r.   r;   r@   rL   rM   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ ZdS )ÚTestDeviceGreenc                 C   s¬   | j  tj¡}| j  tj¡}| j ||g¡ | d¡}t 	tj
jtj||¡}| d| ¡ | d¡ t d¡}| ¡  t 	|j¡}| d¡dks”t‚| ¡  |jdd d S )Nr   r   s   hirB   rC   T)Úblock)r   r   r	   r   r    rH   r4   r!   ÚgeventÚspawnZgreenZdevicer
   r-   r%   ÚTimeoutr"   r&   Úgetr   ÚcancelÚkill)r   Úrepr(   r)   ÚgÚtimeoutZreceiverr   r   r   Útest_green_device›   s    


z!TestDeviceGreen.test_green_deviceN)rN   rO   rP   r\   r   r   r   r   rQ   š   s   rQ   )r#   r	   r   Z	zmq.testsr   r   r   r   r   ÚContextr   Zcontext_factoryr   rS   Z	zmq.greenrQ   r   r   r   r   Ú<module>   s   
 