
    *Vf81                         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y)    N)Queue)EventThread)mock)mark)PYPYBaseZMQTestCase	GreenTestSkipTestc                   "     e Zd ZdZ fdZ xZS )KwargTestSocketNc                 R    |j                  dd       | _        t        |   |i | y )N
test_kwarg)poptest_kwarg_valuesuper__init__)selfargskwargs	__class__s      _/var/www/html/software/conda/envs/catlas/lib/python3.12/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y)KwargTestContextN)r   r   r   r   _socket_class r   r   r    r       s    #Mr   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j0                  j3                  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j0                  j3                  d      d"      d#        Z%y)$TestContextc                 T   | j                         }t        || j                         sJ |j                          | j                         }t        || j                         sJ |j                          | j                         }t        || j                         sJ |j                          y N)Context
isinstanceterm)r   c1c2c3s       r   	test_initzTestContext.test_init!   sz    \\^"dll+++
	\\^"dll+++
	\\^"dll+++
	r   zzmq.Contextc                 <   | j                         5 }| j                   dt        |      v sJ dt        |      vsJ |j                  t        j
                        5 }| j                   dt        |      v sJ |j                  t        j                        5 }| j                   dt        |      v sJ 	 d d d        d d d        d d d        | j                   dt              v sJ dt        |      v sJ y # 1 sw Y   ExY w# 1 sw Y   IxY w# 1 sw Y   MxY w)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nn%R(DI55549,,,CHH% G..)4S	AAAZZ) GT"nn-[9T#YFFFGG	G ..!$S	11149$$$G GG G	G 	Gs<   AD<DC:6D>D:D?DD	DDc                     | j                         }dt        |      v sJ t        j                         dkD  rdt        |      v sJ |j	                          y )Nr2      
IO_THREADS)r'   dirr3   zmq_version_infor)   r   r6   s     r   test_dirzTestContext.test_dir9   sK    lln3s8###!D(3s8+++
r   Nzrequires unittest.mock)reasonc                 D    t        j                  | j                        }y )N)spec)r   Mockcontext)r   ms     r   test_mockablezTestContext.test_mockable@   s    II4<<(r   c                 `    | j                         }|j                          |j                  sJ y r&   )r'   r)   r/   )r   cs     r   	test_termzTestContext.test_termD   s!    LLN	xxxr   c                     t        j                  t              5  | j                         5 }|j	                  t
        j                        }d d d        d d d        j                  sJ j                  sJ y # 1 sw Y   .xY w# 1 sw Y   2xY wr&   )pytestwarnsResourceWarningr'   r2   r3   r4   r/   r   r6   ss      r   test_context_managerz TestContext.test_context_managerI   sn    \\/* 	) )3JJsxx()	) xxxzzz	) )	) 	)s"   B A8B8B	=BBc                 Z    | j                  t        j                  | j                  d       y )N)assertRaisesErrnor3   EINVALr'   )r   s    r   test_fail_initzTestContext.test_fail_initQ   s    szz4<<<r   c                 @   | j                  t        j                  t        j                        \  }}|j	                  t        j
                  d       |j                  dd       |j                          |j                          | j                  j                          y )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   sd    ))#**cjjASszz1%&				r   c                 8   | j                   j                         }| j                   j                  d      }||u sJ |j                          | j                   j                         }| j                   j                         }||usJ |j                  rJ ||u sJ y )N   )
io_threads)r'   instancer)   r/   )r   r6   r+   r,   c4s        r   test_instancezTestContext.test_instance\   s    ll##%\\""a"0Syy
	\\""$\\""$||99}Rxxr   c                 ^   | j                   j                           G d dt        j                        }|j	                         }t        j                  j	                         }|j                          |j                          t        |      t        j                  u sJ t        |      |u sJ y )Nc                       e Zd Zy)<TestContext.test_instance_subclass_first.<locals>.SubContextNr   r   r   r"   r   r   
SubContextrl   j       r   rn   rF   r)   r3   r'   rg   type)r   rn   sctxr6   s       r   test_instance_subclass_firstz(TestContext.test_instance_subclass_firstg   s~    	 	 ""$kk""$
		CyCKK'''DzZ'''r   c                 
   | j                   j                           G d dt        j                        } G d dt        j                        }t        j                  j	                         }|j	                         }|j	                         }|j                          |j                          |j                          t        |      t        j                  u sJ t        |      t        j                  u sJ t        |      |u sJ y )Nc                       e Zd Zy)DTestContext.test_instance_subclass_second.<locals>.SubContextInheritNrm   r"   r   r   SubContextInheritrv   w   ro   r   rw   c                       e Zd ZdZy)FTestContext.test_instance_subclass_second.<locals>.SubContextNoInheritN)r   r   r   	_instancer"   r   r   SubContextNoInheritry   z   s    Ir   r{   rp   )r   rw   r{   r6   rr   sctx2s         r   test_instance_subclass_secondz)TestContext.test_instance_subclass_secondt   s    	 		#++ 	 kk""$ ))+#,,.
		

CyCKK'''DzS[[(((E{1111r   c                   	 | j                   j                          t               	 G d d| j                        	fd}d}t	        |      D cg c]  }t        |       }}|D cg c]  }|j                          c} j                         }t        |      sJ t	        |      D ]  }	j                  d      }||u rJ  |j                          |D cg c]  }|j                  d       c} y c c}w c c}w c c}w )Nc                        e Zd Z fdZ xZS )9TestContext.test_instance_threadsafe.<locals>.SlowContextc                 N    t        j                  d       t        |   |i | y )N   )timesleepr   r   )r   akwr   s      r   r   zBTestContext.test_instance_threadsafe.<locals>.SlowContext.__init__   s     

1 !*r*r   )r   r   r   r   r   r   s   @r   SlowContextr      s    + +r   r   c                  D    j                   j                                y r&   )putrg   )r   qs   r   fz/TestContext.test_instance_threadsafe.<locals>.f   s    EE+&&()r      target   timeout)rF   r)   r   r'   ranger   startrg   r(   getjoin)
r   r   Nithreadstr6   
thread_ctxr   r   s
           @@r   test_instance_threadsafez$TestContext.test_instance_threadsafe   s    G	+$,, 	+
	* -21X66#66#$q$""$#{+++q 	%Aq)J$$$	% 	
$+,q	, 7$ 	-s   C;*D Dc                     d}t               5 }|j                  t        j                  |      5 }|j                  |u sJ 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)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   st    2 	C3CJJ3CD C..2BBBBC	C 	CC C	C 	Cs"   "AAAA	AA'c                 
    G d dt         j                        }| j                         5 }|j                  t         j                  |      5 }t        ||      sJ 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nc                       e Zd Zy)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   st    	3:: 	 \\^ 	3sCHH<@ 3A!!\2223	3 	33 3	3 	3s#   "A9A-A9-A6	2A99Bc                 H   | j                         }t        d      D ]j  }t        d      D cg c]!  }|j                  t        j                        # }}|D cg c]  }|j                          c} t        j                  d       l |j                          yc c}w c c}w )z9opening and closing many sockets shouldn't cause problemsr   A   {Gz?N)	r'   r   r2   r3   REPr`   r   r   r)   r   r6   r   socketsrQ   s        r   test_many_socketszTestContext.test_many_sockets   sw    llnr 	A49"I>qszz#''*>G> '(1QWWY(JJt		
 	
	 ?(s   &BBc                    | j                         }d|_        |j                  dk(  sJ |j                  t        j                        }|j                  dk(  sJ |j                  t        j                        dk(  sJ |j                          d|_        |j                  t        j                        }|j                          |j                          y)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    lln
zzQJJswwxx1}}||CJJ'1,,,		JJsww		
r   winzSegfaults on Windowsc                 ^   | j                         }t        d      D cg c]!  }|j                  t        j                        # }}|ddd   D cg c]  }|j                          c} |j                          t        j                  d       |D ]  }|j                  rJ  yc c}w c c}w )z$Context.destroy should close socketsr   Nre   r   )
r'   r   r2   r3   r   r`   destroyr   r   r/   r   s        r   test_destroyzTestContext.test_destroy   s     lln05b	:13::cgg&:: $CaCL)q)

4 	A88O8	 ; 	*s   &B%B*c                 B   | j                  t        j                  t        j                        \  }}|j	                  d       t        j                  d       | j                  j                  d       t        j                  d       ||fD ]  }|j                  rJ  y)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   sv    ))#''377;S

4A&

4s 	A88O8	r   c                    | j                         }|j                  t        j                        }|j                  rJ t        |j                        }|j                          |j                  d       |j                         sJ d       |j                          |j                  d       |j                         rJ d       y)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    llnJJsww88|#((#			szz|888|			s::<=!==<r   c                      t         rt        d       fd}t        |      }|j                          |j	                  d       |j                         rJ d       y)z+test close&term by garbage collection alonezGC doesn't work c                  F    fd}  |         t        j                          y )Nc                  d    j                         } | j                  t        j                         y r&   )r'   r2   r3   r4   )r6   r   s    r   innerz/TestContext.test_gc.<locals>.gcf.<locals>.inner   s    lln

388$r   )gccollect)r   r   s    r   gcfz TestContext.test_gc.<locals>.gcf   s    %
 GJJLr   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   sQ    -..	 #			q::<T!TT<r   c                 :      G fdd       fd} |        y)z6ctx.destroy should succeed when cyclic ref prevents gcc                        e Zd ZddZ fdZy)8TestContext.test_cyclic_destroy.<locals>.CyclicReferenceNc                     || _         y r&   )parent)r   r   s     r   r   zATestContext.test_cyclic_destroy.<locals>.CyclicReference.__init__  s	    $r   c                 .    || _          |       | _        y r&   )sockchild)r   r   CyclicReferences     r   crashz>TestContext.test_cyclic_destroy.<locals>.CyclicReference.crash  s     	,T2
r   r&   )r   r   r   r   r   )r   s   r   r   r     s    %3r   r   c                      j                         } | j                  t        j                        }        }|j	                  |       | j                          y r&   )r'   r2   r3   r5   r   r   )r6   r   rJ   r   r   s      r   	crash_zmqz2TestContext.test_cyclic_destroy.<locals>.crash_zmq  s<    ,,.C::chh'D!AGGDMKKMr   Nr"   )r   r   r   s   ` @r   test_cyclic_destroyzTestContext.test_cyclic_destroy  s    	3 	3	 	r   c                      j                         t               j                           fd}t        |      }|j	                          j                  d       j                         sJ d       t        j                  d       j                          |j                  d       |j                         rJ d       y)	z/ctx.term should not crash active threads (#139)c                     j                  t        j                        } | j                  d       j	                          	 | j                          	 | j                          j                  d       y # t        j                  $ r9}|j                  t        j                  k(  sJ Y d }~| j                          y d }~ww xY w# | j                          w xY w)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    

377#A!!"34GGI
 	IIDE << ww#))+++		 	s*   A6 6C	B=(C =CC 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    llng			F % 		zz|555|

4
	q::<H!HH<r   c                     | j                         }|j                  t        j                        }|j	                  d       |j                          |j                          |j                  sJ |j                  sJ y )Nr   )r'   r2   r3   PUBr   r`   r   r/   rP   s      r   test_destroy_no_socketsz#TestContext.test_destroy_no_sockets:  sW    llnJJsww	/0		xxxzzzr   c                 h   t        j                         dk  rt        d      | j                         }|j	                  t         j
                  d       |j                  t         j
                        dk(  sJ d|_        |j                  dk(  sJ |j                  t         j
                        dk(  sJ y )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(=>>lln#wws'1,,,#%%%wws'3...r   c                    | j                         }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 |j                  t        j                        }|j                          |j                          y r&   )
r'   rY   deepcopy_shadow
underlyingr2   r3   r   r`   r)   )r   r*   r+   c2br,   rQ   s         r   	test_copyzTestContext.test_copyM  s    \\^YYr]mmB]]2zzzzzz}}---}}---}}...IIcgg		
	r   c                 `   | j                         }| j                   j                  |j                        }|j                  |j                  k(  sJ |j                  t        j
                        }|j                          ~|j                  rJ |j                  t        j
                        }| j                   j                  |      }|j                  t        j
                        5 }	 d d d        j                  sJ |j                  rJ |j                          | j                  |      }|j                  |j                  k(  sJ ~|j                  rJ |j                          | j                  t        j                  |j                  t        j
                         ~y # 1 sw Y   xY wr&   )r'   shadowr   r2   r3   r   r`   r/   r)   rU   EFAULT)r   r6   ctx2rQ   s2ctx3s         r   test_shadowzTestContext.test_shadow[  s5   lln||""3>>2~~000JJsww		::~JJsww||""3'[[! 	R	 yyy88|		||C #..000::~
szz4;;@	 	s   (F$$F-c                    	 ddl m}m}m} |j                         }|j                  |t        j                        }|j                  |d       | j                  j                  |      }|j                  t        j                        }|j                  d       |j                  |d       | j!                  |      }|dk(  sJ |j#                          y # t        $ r t        d      w xY w)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 hhjKKSXX&Q%||))#.KK!			,		!Uyy|u}}		  	.,--	.s   
C C)zNo fork on Windowsc                    | j                   j                         }t        |      }t        j                         \  }}t        j
                  |d      }t        j                         }|dk(  r| j                   j                         }t        j
                  |d      }t        |      }|j                          |j                  t        |      dz          |j                          |j                          t        j                  d       nt        j                  |       |j                         }	|j                          |	sJ t        |	      |k7  sJ |j                          y )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  s    ll##%3WWY
d4%GGI	>,,'')CYYtS)Fc7LHHJLL\*T12LLNLLNHHQKHHTN__&
z:-///
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$       s   	 I	% T[[&>?) @)
=	(2&-<C3  T[[((/8NO P	>U(*I:/4" T[[((/8LM N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>r%     sb     	 	 
   #    
 @ @*cjj *$s{{ $}/ }@ 	r   