
    Zd81                         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mZm	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  G d dej                  Z G d	 d
ej                  Z G d de          ZdS )    N)Queue)EventThread)mock)mark)PYPYBaseZMQTestCase	GreenTestSkipTestc                   "     e Zd ZdZ fdZ xZS )KwargTestSocketNc                 p    |                     dd           | _         t                      j        |i | d S )N
test_kwarg)poptest_kwarg_valuesuper__init__)selfargskwargs	__class__s      6lib/python3.11/site-packages/zmq/tests/test_context.pyr   zKwargTestSocket.__init__   s;     &

< > >$)&)))))    )__name__
__module____qualname__r   r   __classcell__r   s   @r   r   r      s>        * * * * * * * * *r   r   c                       e Zd ZeZdS )KwargTestContextN)r   r   r   r   _socket_class r   r   r    r       s        #MMMr   r    c                      e Zd Zd ZdZd Zd Z ej        e	du d          d             Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ej        ej                            d          d          d             Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$ ej        ej                            d          d"          d#             Z%dS )$TestContextc                    |                                  }t          || j                   sJ |                                 |                                  }t          || j                   sJ |                                 |                                  }t          || j                   sJ |                                 d S N)Context
isinstanceterm)r   c1c2c3s       r   	test_initzTestContext.test_init!   s    \\^^"dl+++++
			\\^^"dl+++++
			\\^^"dl+++++
					r   zzmq.Contextc                 `   |                                  5 }| j         dt          |          v sJ dt          |          vsJ |                    t          j                  5 }| j         dt          |          v sJ |                    t          j                  5 }| j         dt          |          v sJ 	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   | j         dt          |          v sJ dt          |          v sJ d S )Nz()closedz
(1 socket)z(2 sockets))r'   	_repr_clsreprsocketzmqPUSHPULL)r   ctxpushpulls       r   	test_reprzTestContext.test_repr.   s   \\^^ 	Gsn(((DII5555499,,,,CH%% G.444S		AAAAZZ)) GT"n999T#YYFFFFFG G G G G G G G G G G G G G GG G G G G G G G G G G G G G G	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G .$$$S		1111499$$$$$$sZ   AC5#;CC;CCCCCC5C"	"C5%C"	&C55C9<C9c                     |                                  }dt          |          v sJ t          j                    dk    rdt          |          v sJ |                                 d S )Nr2      
IO_THREADS)r'   dirr3   zmq_version_infor)   r   r6   s     r   test_dirzTestContext.test_dir9   sb    llnn3s88####!!D((3s88++++




r   Nzrequires unittest.mock)reasonc                 :    t          j        | j                  }d S )N)spec)r   Mockcontext)r   ms     r   test_mockablezTestContext.test_mockable@   s    I4<(((r   c                 h    |                                  }|                                 |j        sJ d S r&   )r'   r)   r/   )r   cs     r   	test_termzTestContext.test_termD   s+    LLNN	xr   c                 "   t          j        t                    5  |                                 5 }|                    t
          j                  }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |j        sJ |j        sJ d S r&   )pytestwarnsResourceWarningr'   r2   r3   r4   r/   r   r6   ss      r   test_context_managerz TestContext.test_context_managerI   s    \/** 	) 	) )3JJsx(() ) ) ) ) ) ) ) ) ) ) ) ) ) )	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) xzs4   A2 AA2A	A2"A	#A22A69A6c                 R    |                      t          j        | j        d           d S )N)assertRaisesErrnor3   EINVALr'   )r   s    r   test_fail_initzTestContext.test_fail_initQ   s$    sz4<<<<<<r   c                 P   |                      t          j        t          j                  \  }}|                    t          j        d           |                    dd           |                                 |                                 | j        	                                 d S )Nr   s   helloF)copy)
create_bound_pairr3   ROUTERDEALER
setsockoptLINGERsendcloserF   r)   )r   repreqs      r   test_term_hangzTestContext.test_term_hangT   s    ))#*cjAASsz1%%%&&&				r   c                 0   | j                                         }| j                             d          }||u sJ |                                 | j                                         }| j                                         }||usJ |j        rJ ||u sJ d S )N   )
io_threads)r'   instancer)   r/   )r   r6   r+   r,   c4s        r   test_instancezTestContext.test_instance\   s    l##%%\""a"00Syyyy
			\""$$\""$$88889Rxxxxxxr   c                 |   | j                                           G d dt          j                  }|                                }t          j                                        }|                                 |                                 t          |          t          j        u sJ t          |          |u sJ d S )Nc                       e Zd ZdS )<TestContext.test_instance_subclass_first.<locals>.SubContextNr   r   r   r"   r   r   
SubContextrl   j           Dr   rn   rF   r)   r3   r'   rg   type)r   rn   sctxr6   s       r   test_instance_subclass_firstz(TestContext.test_instance_subclass_firstg   s    	 	 	 	 	 	 	 	 ""$$k""$$


		CyyCK''''DzzZ''''''r   c                 6   | j                                           G d dt          j                  } G d dt          j                  }t          j                                        }|                                }|                                }|                                 |                                 |                                 t          |          t          j        u sJ t          |          t          j        u sJ t          |          |u sJ d S )Nc                       e Zd ZdS )DTestContext.test_instance_subclass_second.<locals>.SubContextInheritNrm   r"   r   r   SubContextInheritrv   w   ro   r   rw   c                       e Zd ZdZdS )FTestContext.test_instance_subclass_second.<locals>.SubContextNoInheritN)r   r   r   	_instancer"   r   r   SubContextNoInheritry   z   s        IIIr   r{   rp   )r   rw   r{   r6   rr   sctx2s         r   test_instance_subclass_secondz)TestContext.test_instance_subclass_secondt   s   	 	 	 	 	 	 	 		 	 	 	 	#+ 	 	 	 k""$$ ))++#,,..


		

CyyCK''''DzzS[((((E{{1111111r   c                    | j                                          t                       G d d| j                  fdd}fdt	          |          D             }d |D                                              }t          |          sJ t	          |          D ]}                    d          }||u sJ |                                 d	 |D              d S )
Nc                        e Zd Z fdZ xZS )9TestContext.test_instance_threadsafe.<locals>.SlowContextc                 b    t          j        d            t                      j        |i | d S )N   )timesleepr   r   )r   akwr   s      r   r   zBTestContext.test_instance_threadsafe.<locals>.SlowContext.__init__   s2    
1  !*r*****r   )r   r   r   r   r   r   s   @r   SlowContextr      s8        + + + + + + + + +r   r   c                  V                                                                     d S r&   )putrg   )r   qs   r   fz/TestContext.test_instance_threadsafe.<locals>.f   s'    EE+&&(()))))r      c                 0    g | ]}t                     S )target)r   ).0ir   s     r   
<listcomp>z8TestContext.test_instance_threadsafe.<locals>.<listcomp>   s$    6666###666r   c                 6    g | ]}|                                 S r"   )startr   ts     r   r   z8TestContext.test_instance_threadsafe.<locals>.<listcomp>   s     $$$q$$$r      timeoutc                 :    g | ]}|                     d           S )r   r   )joinr   s     r   r   z8TestContext.test_instance_threadsafe.<locals>.<listcomp>   s&    ,,,q		,,,r   )rF   r)   r   r'   rangerg   r(   get)	r   Nthreadsr6   r   
thread_ctxr   r   r   s	         @@@r   test_instance_threadsafez$TestContext.test_instance_threadsafe   s0   GG	+ 	+ 	+ 	+ 	+$, 	+ 	+ 	+
	* 	* 	* 	* 	* 	* 6666U1XX666$$G$$$$""$$#{+++++q 	% 	%Aq))J$$$$$


,,G,,,,,,r   c                     d}t                      5 }|                    t          j        |          5 }|j        |u sJ 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nztesting one two three)r   )r    r2   r3   r\   r   )r   r   r6   r2   s       r   test_socket_passes_kwargsz%TestContext.test_socket_passes_kwargs   s   2 	C3CJ3CDD C.2BBBBBBC C C C C C C C C C C C C C C	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	Cs4   "A$A A$A	A$A	A$$A(+A(c                 (    G d dt           j                  }|                                 5 }|                    t           j        |          5 }t          ||          sJ 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nc                       e Zd ZdS )7TestContext.test_socket_class_arg.<locals>.CustomSocketNrm   r"   r   r   CustomSocketr      ro   r   r   )socket_class)r3   Socketr'   r2   r4   r(   )r   r   r6   rQ   s       r   test_socket_class_argz!TestContext.test_socket_class_arg   s"   	 	 	 	 	3: 	 	 	 \\^^ 	3sCH<@@ 3A!!\2222223 3 3 3 3 3 3 3 3 3 3 3 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s5   "BA/#B/A3	3B6A3	7BBBc                     |                                  t          d          D ]=}fdt          d          D             }d |D              t          j        d           >                                 dS )z9opening and closing many sockets shouldn't cause problemsr   c                 N    g | ]!}                     t          j                  "S r"   r2   r3   REPr   r   r6   s     r   r   z1TestContext.test_many_sockets.<locals>.<listcomp>   s'    >>>qszz#'**>>>r   A   c                 6    g | ]}|                                 S r"   r`   r   rQ   s     r   r   z1TestContext.test_many_sockets.<locals>.<listcomp>   s     (((1QWWYY(((r   {Gz?N)r'   r   r   r   r)   )r   r   socketsr6   s      @r   test_many_socketszTestContext.test_many_sockets   s|    llnnr 	 	A>>>>E"II>>>G((((((Jt




r   c                    |                                  }d|_        |j        dk    sJ |                    t          j                  }|j        dk    sJ |                    t          j                  dk    sJ |                                 d|_        |                    t          j                  }|                                 |	                                 dS )z*setting socket options with ctx attributesr   r   N)
r'   lingerr2   r3   REQ
getsockoptr^   r`   	subscriber)   rP   s      r   test_sockoptszTestContext.test_sockopts   s    llnn
zQJJswx1}}}}||CJ''1,,,,				JJsw				




r   winzSegfaults on Windowsc                     |                                  fdt          d          D             }d |ddd         D                                               t          j        d           |D ]}|j        sJ dS )z$Context.destroy should close socketsc                 N    g | ]!}                     t          j                  "S r"   r   r   s     r   r   z,TestContext.test_destroy.<locals>.<listcomp>   s'    :::13::cg&&:::r   r   c                 6    g | ]}|                                 S r"   r   r   s     r   r   z,TestContext.test_destroy.<locals>.<listcomp>   s     )))q)))r   Nre   r   )r'   r   destroyr   r   r/   )r   r   rQ   r6   s      @r   test_destroyzTestContext.test_destroy   s     llnn::::b		::: 	*)GCCaCL))))
4 	 	A8OOOO	 	r   c                 0   |                      t          j        t          j                  \  }}|                    d           t          j        d           | j                            d           t          j        d           ||fD ]}|j	        sJ dS )z4Context.destroy should set linger on closing sockets   hir   r   )r   N)
rZ   r3   r   r   r_   r   r   rF   r   r/   )r   rb   ra   rQ   s       r   test_destroy_lingerzTestContext.test_destroy_linger   s    ))#'37;;S
4A&&&
4s 	 	A8OOOO	 	r   c                    |                                  }|                    t          j                  }|j        rJ t          |j                  }|                                 |                    d           |	                                s
J d            |
                                 |                    d           |	                                r
J d            dS )z Context.term won't close socketsr   g?r   zContext should be waitingzContext should have closedN)r'   r2   r3   r   r/   r   r)   r   r   is_aliver`   )r   r6   rQ   r   s       r   test_term_noclosezTestContext.test_term_noclose   s    llnnJJsw8#(###					szz||888888					s::<<==!======r   c                      t           rt          d           fd}t          |          }|                                 |                    d           |                                r
J d            dS )z+test close&term by garbage collection alonezGC doesn't work c                  L    fd}  |              t          j                     d S )Nc                  n                                     } |                     t          j                   d S r&   )r'   r2   r3   r4   )r6   r   s    r   innerz/TestContext.test_gc.<locals>.gcf.<locals>.inner   s*    llnn

38$$$$$r   )gccollect)r   r   s    r   gcfz TestContext.test_gc.<locals>.gcf   s8    % % % % %
 EGGGJLLLLLr   r   r   r   z1Garbage collection should have cleaned up contextN)r   r   r   r   r   r   )r   r   r   s   `  r   test_gczTestContext.test_gc   s     	/-...	 	 	 	 	 #					q::<<TT!TTTTTTr   c                 H      G fdd           fd} |             dS )z6ctx.destroy should succeed when cyclic ref prevents gcc                   "    e Zd ZddZ fdZdS )8TestContext.test_cyclic_destroy.<locals>.CyclicReferenceNc                     || _         d S r&   )parent)r   r   s     r   r   zATestContext.test_cyclic_destroy.<locals>.CyclicReference.__init__  s    $r   c                 6    || _          |           | _        d S r&   )sockchild)r   r   CyclicReferences     r   crashz>TestContext.test_cyclic_destroy.<locals>.CyclicReference.crash  s     	,_T22


r   r&   )r   r   r   r   r   )r   s   r   r   r     sB        % % % %3 3 3 3 3 3 3r   r   c                                                       } |                     t          j                  }             }|                    |           |                                  d S r&   )r'   r2   r3   r5   r   r   )r6   r   rJ   r   r   s      r   	crash_zmqz2TestContext.test_cyclic_destroy.<locals>.crash_zmq  sP    ,,..C::ch''D!!AGGDMMMKKMMMMMr   Nr"   )r   r   r   s   ` @r   test_cyclic_destroyzTestContext.test_cyclic_destroy  se    	3 	3 	3 	3 	3 	3 	3 	3 	3 	3	 	 	 	 	 	 		r   c                                                       t                                                        fd}t          |          }|                                                     d                                           s
J d            t          j        d           	                                 |
                    d           |                                r
J d            dS )	z/ctx.term should not crash active threads (#139)c                                          t          j                  } |                     d                                            	 |                                  nH# t          j        $ r6}|j        t          j        k    sJ Y d }~| 	                                 d S d }~ww xY w	 | 	                                 n# | 	                                 w xY w
                    d           d S )Ntcp://127.0.0.1z,recv should have been interrupted with ETERM)r2   r3   r   bind_to_random_portsetrecvZMQErrorerrnoETERMr`   fail)rQ   er6   evtr   s     r   blockz+TestContext.test_term_thread.<locals>.block#  s    

37##A!!"3444GGIII<   w#)++++						 
 								IIDEEEEEs0   A  B>  B%/B B>  B%%B> >Cr   r   zsync event never firedr   r   z%term should have interrupted s.recv()N)r'   r   clearr   r   waitis_setr   r   r)   r   r   )r   r   r   r6   r   s   `  @@r   test_term_threadzTestContext.test_term_thread  s    llnngg			F 	F 	F 	F 	F 	F 	F %   				zz||555555
4


	q::<<HH!HHHHHHr   c                 
   |                                  }|                    t          j                  }|                    d           |                                 |                                 |j        sJ |j        sJ d S )Nr   )r'   r2   r3   PUBr   r`   r   r/   rP   s      r   test_destroy_no_socketsz#TestContext.test_destroy_no_sockets:  sp    llnnJJsw	/000				xzr   c                 v   t          j                    dk     rt          d          |                                 }|                    t           j        d           |                    t           j                  dk    sJ d|_        |j        dk    sJ |                    t           j                  dk    sJ d S )Nr;   z context options require libzmq 3re   d   )r3   r?   r   r'   r   MAX_SOCKETSr   max_socketsr@   s     r   test_ctx_optszTestContext.test_ctx_optsC  s    !!D((=>>>llnn###wws''1,,,,#%%%%wws''3......r   c                    |                                  }t          j        |          }t          j        |          }t          j        |          }|j        sJ |j        sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |                    t          j                  }|                                 |	                                 d S r&   )
r'   rY   deepcopy_shadow
underlyingr2   r3   r   r`   r)   )r   r*   r+   c2br,   rQ   s         r   	test_copyzTestContext.test_copyM  s    \\^^Yr]]mB]2zz}----}----}....IIcg				
					r   c                 $   |                                  }| j                             |j                  }|j        |j        k    sJ |                    t          j                  }|                                 ~|j        rJ |                    t          j                  }| j                             |          }|                    t          j                  5 }	 d d d            n# 1 swxY w Y   |j        sJ |j        rJ |                                 |                      |          }|j        |j        k    sJ ~|j        rJ |                                 | 	                    t          j
        |j        t          j                   ~d S r&   )r'   shadowr   r2   r3   r   r`   r/   r)   rU   EFAULT)r   r6   ctx2rQ   s2ctx3s         r   test_shadowzTestContext.test_shadow[  s   llnn|""3>22~0000JJsw				:JJsw|""3''[[!! 	R	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 y8				||C  #.0000:


sz4;@@@DDs   C))C-0C-c                    	 ddl m}m}m} n# t          $ r t          d          w xY w|                                }|                    |t          j                  }|	                    |d           | j
                            |          }|                    t          j                  }|                    d           |                    |d           |                     |          }|dk    sJ |                                 d S )Nr   )zctxzsocketzstrzRequires pyczmqz
inproc://ar   )pyczmqr  r  r  	Exceptionr   newr3   r4   bindr'   shadow_pyczmqr2   r5   connectr_   r   r`   )	r   r  r  r  r6   r   r   brcvds	            r   test_shadow_pyczmqzTestContext.test_shadow_pyczmqu  s   	.22222222222 	. 	. 	.,---	. hhjjKKSX&&Q%%%|))#..KK!!			,		!Uyy||u}}}}						s   
 'zNo fork on Windowsc                    | j                                         }t          |          }t          j                    \  }}t          j        |d          }t          j                    }|dk    r| j                                         }t          j        |d          }t          |          }|                                 |                    t          |          dz              |
                                 |                                 t          j        d           nt          j        |           |                                }	|                                 |	sJ t          |	          |k    sJ |                                 d S )Nrr   w
)r'   rg   idospipefdopenforkr)   writestrflushr`   _exitreadlineint)
r   r6   parent_ctx_idr_fdw_fdreader	child_pidwriterchild_ctx_id
child_id_ss
             r   test_fork_instancezTestContext.test_fork_instance  s5   l##%%3WYY
d4%%GII	>>,''))CYtS))Fc77LHHJJJLL\**T1222LLNNNLLNNNHQKKKKHTNNN__&&
:-////




r   )&r   r   r   r-   r0   r9   rA   r   skipifr   rH   rK   rR   rW   rc   ri   rs   r}   r   r   r   r   r   sysplatform
startswithr   r   r   r   r   r   r   r   r   r  r  r(  r"   r   r   r$   r$       sL       	 	 	 I	% 	% 	%   T[&>???) ) @?)  
  = = =  	 	 	( ( (2 2 2&- - -<C C C3 3 3      T[((//8NOOO  PO	 	 	> > >U U U(  *I I I:  / / /    4  " T[((//8LMMM  NM  r   r$   )rY   r   r  r*  r   queuer   	threadingr   r   unittestr   rM   r   r3   	zmq.testsr   r	   r
   r   r   r   r'   r    r$   TestContextGreenr"   r   r   <module>r2     sM    				 				 



        # # # # # # # #              



 @ @ @ @ @ @ @ @ @ @ @ @* * * * *cj * * *$ $ $ $ $s{ $ $ $} } } } }/ } } }@	( 	(r   