o
    tf>^                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlZd dlmZ d dlZd dlmZmZmZmZmZ e  dkZe  dZeejdZercdnd	ZG d
d deZeresd dlZG dd deeZ dS dS dS )    N)mock)mark)BaseZMQTestCase	GreenTestSkipTesthave_gevent	skip_pypypypywindowsCI  d   c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	Zd
d Zdd Z	e
jedu 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ed)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d;d< Z#e
je$d=dd>d? Z%d@dA Z&dBdC Z'dDdE Z(dFdG Z)dHdI Z*dJdK Z+e
je,re-pe.j/dLk pe$dMde
j0dNdO Z1dPdQ Z2dS )R
TestSocketc                 C   s^   |   }|tj}| tj|jd | tj|jd | tj|jd |	  |
  d S )Nzftl://aztcp://)ContextsocketzmqPUBassertRaisesErrnoEPROTONOSUPPORTbindconnectEINVALclosetermselfctxs r   ^/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/zmq/tests/test_socket.pytest_create   s   zTestSocket.test_createc              
   C   s   d}|   ^}|tjA}|| |tj}|| d}|| | |}||ks1J W d    n1 s;w   Y  |j	du sGJ W d    n1 sQw   Y  |j	du s]J W d    n1 sgw   Y  |j	du ssJ d S )N
inproc://a   hiT)
r   r   r   PUSHr   PULLr   sendrecvclosed)r   urlr   abmsgrcvdr   r   r   test_context_manager(   s    




	zTestSocket.test_context_managerc           	      C   s  d}d}|   `}|tj}|tj}|| ||}d|t|v s-J | || | 	|}||ks@J W d    n1 sJw   Y  t
tj |j|tjd W d    n1 shw   Y  t
tj |j	tjd W d    n1 sw   Y  || W d    n1 sw   Y  W d    n1 sw   Y  |tj}|tj}||}d|t|v sJ |" || || | 	|}||ksJ || W d    n1 sw   Y  || t
tj |j|tjd W d    n	1 sw   Y  t
tj |j	tjd W d    n	1 s4w   Y  W d    n	1 sDw   Y  W d    n1 sTw   Y  W d    d S W d    d S 1 smw   Y  d S )Nr!   r"   zconnect=)flagszbind=)r   r   r   r#   r$   r   r   reprr%   r&   pytestraisesZAgainZDONTWAITZunbindZ
disconnect)	r   r(   r+   r   r)   r*   Zconnect_contextr,   Zbind_contextr   r   r   !test_connectbind_context_managers7   s\   



 




  $z,TestSocket.test_connectbind_context_managersc              
   C   s   | j tjO}|d1 |j}| j tj}|| |d | 	| W d    n1 s2w   Y  W d    n1 sAw   Y  W d    d S W d    d S 1 sYw   Y  d S )Nztcp://127.0.0.1:0s   msg)
contextr   r   r#   r   Zlast_endpointr$   r   r%   r&   )r   pushr(   pullr   r   r   test_bind_random_context]   s   

"z#TestSocket.test_bind_random_contextz
zmq.Socketc                 C   s   | j tj}| j dt|v sJ dt|vsJ W d    n1 s&w   Y  | j dt|v s7J dt|v s?J d S )Nz
(zmq.PUSH)r'   )r3   r   r   r#   	_repr_clsr/   r   r   r   r   r   	test_reprh   s   zTestSocket.test_reprc                 C   sh   |   }|tj}dt|v sJ dt|v sJ dt|v s"J dt|v s*J |  |  d S )Nr%   IDENTITYAFFINITYFD)r   r   r   r   dirr   r   r   r   r   r   test_diro   s   zTestSocket.test_dirNzrequires unittest.mockreasonc                 C   s$   |  tj}tj|d}|  d S )N)spec)r   r   SUBr   ZMockr   )r   r   mr   r   r   test_mockabley   s   zTestSocket.test_mockablec                 C   s   |  tj}|d}d S )Nztcp://*)r   r   r   bind_to_random_port)r   r   pr   r   r   test_bind_unicode      zTestSocket.test_bind_unicodec                 C   s   |  tj}|d d S )Ntcp://127.0.0.1:5555)r   r   r   r   r8   r   r   r   test_connect_unicode   rH   zTestSocket.test_connect_unicodec              
   C   s   |   }|tj}z|d W n tjy, } z|jtjks"J W Y d }~nd }~ww z|d W n tjyO } z|jtjksEJ W Y d }~nd }~ww |	  |
  d S )Nztcp:*zrand://*)r   r   r   r   rE   ZMQErrorerrnor   r   r   r   )r   r   r   er   r   r   test_bind_to_random_port   s    z#TestSocket.test_bind_to_random_portc              	   C   s   |  tjU}d}ttj}|| W d    n1 sw   Y  |t|jv s-J d}ttj}|	| W d    n1 sEw   Y  |t|jv sSJ W d    d S 1 s^w   Y  d S )Nztcp://1.2.3.4.5:1234567znoproc://no/such/file)
r   r   r#   r0   r1   rK   r   strvaluer   )r   r   r(   excr   r   r   test_bind_connect_addr_error   s   "z'TestSocket.test_bind_connect_addr_errorc                 C   s<   | j tj}| j| d}||_|tj|ksJ d S )Ns
   identity  )	r3   r   r   r$   socketsappendidentitygetr:   )r   r   identr   r   r   test_identity   s
   zTestSocket.test_identityc                 C   s>  d}|  tjtj\}}|j|jksJ |j|jksJ | t|jtj	| | t|jtj
| |tj
|d | t|jtj| |tj	| | t|jtj | tj|jtj	 |tj
}|d}|tj
d}||kstJ td ||tj |j|d dd || ksJ |d |jddksJ dS )z2test setting/getting sockopts with unicode stringsu   téstutf16皙?   zlatin-1encodingN)create_bound_pairr   r   rB   send_unicoderecv_unicodeassertRaises	TypeError
setsockopt	SUBSCRIBEr:   Zsetsockopt_unicoder;   Zgetsockopt_unicoder   r   
getsockoptdecodetimesleepZSNDMORE)r   ZtopicrF   r   ZidentbZidentuZidentu2r   r   r   test_unicode_sockopts   s(   

z TestSocket.test_unicode_sockoptsc                 C   s  t  }|dk rd}nd}| t jt j\}}|t jd |t jdks(J |t jd |t jdks9J |j|ks@J d|_|jdksJJ |t j	t j
ksUJ | t j|jt j	d |t j|jkskJ |t jt jksvJ |t j|jksJ |t jt jksJ g }i }t j}|jD ]}t||}	t|	tr|||	< qt jjD ]K}
|
jt jjjt jjjhvrq|
jdrqz||
}W n t jy } z|d|
d	| d
 W Y d}~qd}~ww |dkr|d|
d q|r| ddg|  dS dS )ztest integer sockopts)   r   r   r         )ZHWMROUTERZXPUBZTCPFAILZREQ_ZCURVE_ZPROBE_ROUTERZ
IPC_FILTERZGSSAPIZSTREAM_ZVMCI_BUFFER_SIZEZVMCI_BUFFER_MIN_SIZEZVMCI_BUFFER_MAX_SIZEZVMCI_CONNECT_TIMEOUTZBLOCKYZIN_BATCH_SIZEZOUT_BATCH_SIZEZWSS_TRUST_SYSTEMZONLY_FIRST_SUBSCRIBEZPRIORITYZRECONNECT_STOPZNORM_ZROUTER_Z	BUSY_POLLZXSUB_VERBOSE_ZTOPICS_zgetsockopt(z	) raised .Nl        z=) returned a ridiculous value. It is probably the wrong type.
 )r   zmq_version_infor^   r   rB   rc   LINGERre   hwmZEVENTSPOLLOUTr   r   ZTYPEsocket_type	constants__all__getattr
isinstanceintZSocketOptionZ	_opt_typeZ_OptTypeZint64name
startswithrK   rT   failjoin)r   vZdefault_hwmrF   r   errorsZbackrefrx   r}   rP   optnrM   r   r   r   test_int_sockopts   sd   


 $
zTestSocket.test_int_sockoptsc                 C   sz   | j tj}| j| |tjd | tj	|jdd | tj	|j
d | t|jdd | tj	|jtjd dS )z=Test that appropriate errors are raised on bad socket optionsr   i'        5r"   N)r3   r   r   r   rS   rT   rc   rt   r   r   re   ra   rb   rd   r8   r   r   r   test_bad_sockopts  s   zTestSocket.test_bad_sockoptsc                 C   s@   | j tj}| j| |tjd |tjdksJ dS )ztest set/getsockopt roundtrip.rl   N)	r3   r   r   r   rS   rT   rc   rt   re   )r   rF   r   r   r   test_sockopt_roundtrip$  s   z!TestSocket.test_sockopt_roundtripc                 C   s   |  tjtj\}}| j||g d}| jt|j|dd | jt|j|dd || |	 }||
dks:J |d|ksCJ |j|dd |jdd}||ksVJ dS )	ztest sending unicode objectsu   çπ§FcopyTutf8rY   r\   N)r^   r   PAIRrS   extendra   rb   r%   r_   r&   encoderf   r`   )r   r)   r*   ur   r   r   r   test_send_unicode+  s   
zTestSocket.test_send_unicodec                 C   s`   |  tjtj\}}| j||g | t|jddg |dg | |}|dgks.J dS )z*check type on all frames in send_multipart   ar      bN)	r^   r   r   rS   r   ra   rb   send_multipartrecv_multipart)r   r)   r*   r,   r   r   r   test_send_multipart_check_type:  s   
z)TestSocket.test_send_multipart_check_typec                 C   s  d}t   }|d | d }d||f }|  td | j tj}| j tj	}| j
||g || td |jdddd	}t|tjsPJ |tju sWJ |js\J d
|_|jddgddd	}t|tjsqJ |jrvJ || | |}	tdD ]}
|jr ntd q|jdu sJ |	dgksJ | |}	tdD ]}
|jr ntd q|jdu sJ |	ddgksJ tjdddd	}|jjdu sJ |j|dd}|j|dd}|jjdu sJ |jdu sJ |jdu sJ | |}	|jjdu sJ |	dgksJ | |}	|jjdu sJ |	dgks$J |jdu s,J |jdu s4J |j ~tdD ]}
|jrD ntd q<|jdu sSJ |jdu s[J tjddd}| jt|j|ddd	 dS )zJtest the MessageTracker object for tracking when zmq is done with a bufferztcp://127.0.0.1)z	127.0.0.1r      z%s:%irZ   s	   somethingFT)r   trackr   s   else
   s   againr   )r   N)r   r   getsocknamer   rg   rh   r3   r   r#   r$   rS   r   r   r%   r{   ZMessageTrackerZ_FINISHED_TRACKERdoneZcopy_thresholdr   r   rangeFrametrackerra   
ValueError)r   addrsockportZifacer)   r*   p1p2r+   irC   r   r   r   test_trackerC  sx   










zTestSocket.test_trackerc                 C   s   |   }|tj}|  | tj|jd | tj|jd | tj|j	tj
d | tj|jd | tj|j |  d S )N    s   asdf)r   r   r   r   r   r   ENOTSOCKr   r   rc   rd   r%   r&   r   r   r   r   r   
test_close  s   zTestSocket.test_closec                 C   s`   | j tj}| j| d}||_||jksJ ||tjks#J |j	|tj
ks.J dS )z*set setting/getting sockopts as attributesr   N)r3   r   r   DEALERrS   rT   lingerre   rt   fdr<   )r   r   r   r   r   r   	test_attr  s   zTestSocket.test_attrc                 C   sp   | j tj}| j| zd|_W n	 ty   Y nw | d z|j W n
 ty0   Y d S w | d d S )NZfooz-bad setattr should have raised AttributeErrorz-bad getattr should have raised AttributeError)	r3   r   r   r   rS   rT   appleAttributeErrorr   r8   r   r   r   test_bad_attr  s   


zTestSocket.test_bad_attrc                 C   sd   G dd dt j}|| jt j}| j| |jdksJ d|_|jdks'J |j}|dks0J dS )z subclasses can assign attributesc                       s    e Zd ZdZ fddZ  ZS )z#TestSocket.test_subclass.<locals>.SNc                    s   d| _ t j|i | d S )Nrk   )r)   super__init__)r   r)   kw	__class__r   r   r     s   z,TestSocket.test_subclass.<locals>.S.__init__)__name__
__module____qualname__r)   r   __classcell__r   r   r   r   S  s    r   rk   r   N)r   Socketr3   REPrS   rT   r)   )r   r   r   r)   r   r   r   test_subclass  s   zTestSocket.test_subclassc                 C   sX   |   \}}d}tdD ]}|| qtd tdD ]}| ||gks)J qd S )Nr"   rj   rZ   )r^   r   r%   rg   rh   r   )r   r)   r*   r+   r   r   r   r   test_recv_multipart  s   
zTestSocket.test_recv_multipartc                 C   s<   |   }|tj}|  td |  |jsJ dS )z,s.close() after ctx.destroy() should be fineg{Gz?N)	r   r   r   r   destroyrg   rh   r   r'   r   r   r   r   test_close_after_destroy  s   
z#TestSocket.test_close_after_destroyc                 C   s   |   \}}t  |t}|dksJ |ttj}|tjks#J d}|| |t}|tjks6J | |}|t}|dksFJ ||ksLJ d S )Nr   r"   )	r^   rg   pollPOLL_TIMEOUTr   rv   r%   POLLINr&   )r   r)   r*   Zevtr+   Zmsg2r   r   r   	test_poll  s   




zTestSocket.test_pollc                 C   sD   t jdkr	tddt j }t jdksJ |t jdk s J |dS )z$IPC_PATH_MAX_LEN is a sensible valuer   IPC_PATH_MAX_LEN undefinedz)Surprising value for IPC_PATH_MAX_LEN: %s   i  N)r   IPC_PATH_MAX_LENr   )r   r+   r   r   r   test_ipc_path_max_length  s
   

z#TestSocket.test_ipc_path_max_lengthc              
   C   s   t jdkr	td| jt j}| j| z|d	dt jd   W d S  t j
yD } ztt j|jv s9J W Y d }~d S d }~ww )Nr   r   zipc://{}r)   r   )r   r   r   r3   r   r   rS   rT   r   formatrK   rO   strerror)r   r   rM   r   r   r   test_ipc_path_max_length_msg  s   
 "z'TestSocket.test_ipc_path_max_length_msgzipc not supported on Windows.c                 C   s   | j tj}| j| d}ttj}|	d|  W d   n1 s(w   Y  |j
jtjks6J t|j
}||v sAJ d| v sIJ dS )z3Display the ipc path in case of an ENOENT exceptionz/foo/barzipc://Nzno such file or directory)r3   r   r   r   rS   rT   r0   r1   rK   r   rP   rL   ENOENTrO   lower)r   r   Zinvalid_patherrorerror_messager   r   r   /test_ipc_path_no_such_file_or_directory_message  s   
z:TestSocket.test_ipc_path_no_such_file_or_directory_messagec              	   C   s   t  d dk}t jt jt jt jt jfD ]>}| j|}d|_	|j	dks&J |rNz	|j
dks0J W n	 ty:   Y nw z	|jdksCJ W n	 tyM   Y nw |  qd S )Nr   rj   r   )r   rs   r   rn   rB   REQr   r3   r   ru   Zsndhwmr   Zrcvhwmr   )r   Zzmq3styper   r   r   r   test_hwm  s$   
zTestSocket.test_hwmc                 C   s`   |  tj}t|}t|}|jsJ |jsJ |j|jks"J |j|jks*J |  d S )N)r   r   r   r   deepcopyZ_shadow
underlyingr   )r   r   ZscopyZsdcopyr   r   r   	test_copy  s   



zTestSocket.test_copyc                 C   sZ   |  tjtj\}}ttfD ]}t|d}||}|| |	 }||ks*J qd S )Nascii)
r^   r   r#   r$   
memoryview	bytearrayrO   r   r%   r&   )r   r)   r*   Zbuffer_typerawbytesr+   recvdr   r   r   test_send_buffer   s   
zTestSocket.test_send_bufferc                 C   s   |  tj}|d tj|j}|j|jksJ |  tj}tj|}|j|u s-J |j|jks5J |j|jks=J t|}|j|u sIJ |j|jksQJ |	d d}|
| | |}||kshJ d S )NrI   r"   )r   r   r#   r   r   shadowr   r$   Z_shadow_objr   r%   r&   )r   rF   r   r   s2Zs3sentr,   r   r   r   test_shadow)  s"   




zTestSocket.test_shadowc           	      C   s   z
ddl m}m} W n ty   tdw | }||tj}||tj}tj	
|}tj	
|}|d |d |d | |}|dksNJ d S )Nr   )zctxzsocketzRequires pyczmqr!   r"   )Zpyczmqr   r   	Exceptionr   newr   r#   r$   r   r   r   r   r%   r&   )	r   r   r   r   cacbr)   r*   r,   r   r   r   test_shadow_pyczmq<  s   



zTestSocket.test_shadow_pyczmqc                 C   s   |  tjtj\}}|d d|_t }||tj tdD ]}|	d |
d}|r1 nq!| | |	d | |}|dksGJ |d |	d |
d}|g ks\J d S )Nprefixcr   s   canary   s   prefixmessager   )r^   r   r   rB   	subscribeZPollerregisterr   r   r%   r   r&   Zunsubscribe)r   ZpubsubrF   r   eventsr+   r   r   r   test_subscribe_methodM  s&   








z TestSocket.test_subscribe_methodl        zonly run on 64b and not on CI.c           
   
   C   s   t d}d}z|| }W n ty } ztd| d }~ww |  \}}z|j|dd |jdd}W n tyG } ztd| d }~ww t|}t|}	t	|	|ksXJ |	d |ks`J |	d |kshJ d S )Nr   l       zNot enough memory: %sFr   r   rk   )
osurandomMemoryErrorr   r^   r%   r&   ordr   len)
r   r   NbufrM   r)   r*   r,   byteviewr   r   r   test_large_sendc  s*   
zTestSocket.test_large_sendc                 C   s   |  tjtj\}}dd }dd }ddddi}||| ||}|d |d ks.J |d	 s4J ||| ||}|d |d ksIJ |d	 rOJ d S )
Nc                 S   s8   g }| | dg  t| d d}|| |S )N
identitiescontentr   )r   rV   jsondumpsr   rT   )r+   framesr   r   r   r   	serialize  s
   
z3TestSocket.test_custom_serialize.<locals>.serializec                 S   s*   | d d }t | d d}||dS )Nrk   r   )r   r   )r   loadsrf   )r   r   r   r   r   r   deserialize  s
   z5TestSocket.test_custom_serialize.<locals>.deserializer   r   bee)r)   r*   r   )r^   r   r   rn   Zsend_serializedZrecv_serialized)r   r)   r*   r   r  r+   r   r2r   r   r   test_custom_serialize}  s    	

z TestSocket.test_custom_serialize)3r   r   r   r    r-   r2   r6   r7   r9   r>   r   skipifr   rD   rG   rJ   rN   rR   rX   ri   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	   on_cisysmaxsizeZlarger   r  r   r   r   r   r      s^    
&	

S	
F
	
	

	r   c                   @   s`   e Zd ZejZejZdZdd Ze	j
eed dddd Ze	j
eed	 d
ddd ZdS )TestSocketGreenzzmq.green.Socketc                    sN   |   \ }td fdd}td}|  | tj|j |  d S )Ng      ?c                      s
     dS )Nr"   )r%   r   r)   r   r   <lambda>  s   
 z.TestSocketGreen.test_timeout.<locals>.<lambda>rZ   )r^   geventZspawn_laterTimeoutstartra   r&   kill)r   r*   gtimeoutr   r
  r   test_timeout  s   
zTestSocketGreen.test_timeoutZRCVTIMEOzrequires RCVTIMEOr?   c                 C   sn   | j tj}tjdd}d|_W d    n1 sw   Y  |  t|dks,J |d j	t
ks5J d S )NTrecordr   r   r   )r3   r   r   r   warningscatch_warningsZrcvtimeor   r   categoryUserWarningr   r   wr   r   r   test_warn_set_timeo     z#TestSocketGreen.test_warn_set_timeoZSNDTIMEOzrequires SNDTIMEOc                 C   sn   | j tj}tjdd}|j W d    n1 sw   Y  |  t|dks,J |d j	t
ks5J d S )NTr  r   r   )r3   r   r   r   r  r  Zsndtimeor   r   r  r  r  r   r   r   test_warn_get_timeo  r  z#TestSocketGreen.test_warn_get_timeoN)r   r   r   r   Z
skip_greenr   r   r7   r  r   r  hasattrr   r  r  r   r   r   r   r	    s    
r	  )!r   rL   r   r   platformr   r  rg   r  Zunittestr   r0   r   r   Z	zmq.testsr   r   r   r   r   python_implementationr   r	   r~   r
   boolenvironrV   r  r   r   r  r	  r   r   r   r   <module>   s8        