
    Ef=                         d 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 ddl	Z	ddl	m
Z
 ddlZddlmZ ddlmZ ddlmZ ddlmZ  G d	 d
e      Z G d de      Z G d de      Zy)zTest asyncio support    N)CancelledError)Process)mark)AsyncioAuthenticator)BaseZMQTestCase)TestThreadAuthenticationc                       e Zd Zd Zy)ProcessForTeardownTestc                    t         j                  j                         }|j                  t        j
                        }|j                  d       d }t        j                         }t        j                   ||      d      }	 |j                  |       J d       # t        j                  $ r Y nw xY w	 |j                          y# |j                          w xY w)z;Leave context, socket and event loop upon implicit disposaltcp://127.0.0.1c                 @   K   | j                          d {    y 7 wN)recv)sockets    8/usr/lib/python3/dist-packages/zmq/tests/test_asyncio.pynever_ending_taskz5ProcessForTeardownTest.run.<locals>.never_ending_task   s     ++-s      timeoutz,never_ending_task was completed unexpectedlyN)zaioContextinstancer   zmqPAIRbind_to_random_portasyncionew_event_loopwait_forrun_until_completeTimeoutErrorclose)selfactxr   r   loopcoros         r   runzProcessForTeardownTest.run   s     ||$$&SXX&""#45	  %%' 1& 91E	##D) IHH5 ## 		 JJLDJJLs*   B C B2/C 1B22C CN)__name__
__module____qualname__r&        r   r
   r
      s    r+   r
   c                       e Zd Zej                  Z fdZ fdZd Zd Zd Z	d Z
d Z ej                   eed       d	
      d        Z ej                   eed       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ej                  j                  ej>                  jA                  d      d
      d        Z!d Z"d Z#d Z$ xZ%S ) TestAsyncIOSocketc                 T    t        j                         | _        t        |           y r   r   r   r$   supersetUpr"   	__class__s    r   r1   zTestAsyncIOSocket.setUp0       **,	r+   c                     t         |           | j                  j                          t        j
                  i k(  sJ dt        j                  v r(t        j                  j                  t               k(  sJ y y )Nzzmq._asyncio_selector)r0   tearDownr$   r!   r   
_selectorssysmodulesr   _asyncio_selector_selector_loopssetr2   s    r   r6   zTestAsyncIOSocket.tearDown4   s[    		"$$$"ckk1((88CEAAA 2r+   c                     | j                   j                  t        j                        }t	        |t
        j                        sJ |j                          y r   )contextr   r   PUSH
isinstancer   Socketr!   )r"   ss     r   test_socket_classz#TestAsyncIOSocket.test_socket_class<   s7    LL)!T[[)))		r+   c                 X   t         j                  j                  j                         }t         j                  j                         }|j	                          |j	                          t        |      t         j                  u sJ t        |      t         j                  j                  u sJ y r   )r   r   r   r   termtype)r"   r#   ctxs      r   test_instance_subclass_firstz.TestAsyncIOSocket.test_instance_subclass_firstA   sp    {{""++-kk""$
		CyCKK'''DzS[[00000r+   c                 X   t         j                  j                         }t         j                  j                  j                         }|j	                          |j	                          t        |      t         j                  u sJ t        |      t         j                  j                  u sJ y r   )r   r   r   r   rE   rF   )r"   rG   r#   s      r   test_instance_subclass_secondz/TestAsyncIOSocket.test_instance_subclass_secondI   sp    kk""${{""++-
		CyCKK'''DzS[[00000r+   c                 P      fd} j                   j                   |              y )Nc                    K   j                  t        j                  t        j                        \  } }|j	                         }|j                         rJ | j                  d       d {    | d {   }|dgk(  sJ y 7 7 w)N   hi)create_bound_pairr   r?   PULLrecv_multipartdonesend)abfrecvdr"   s       r   testz3TestAsyncIOSocket.test_recv_multipart.<locals>.testR   sr     ))#((CHH=DAq  "Avvx<&&-GEUG###  s$   A(B+B,	B5B6BBr$   r   r"   rW   s   ` r   test_recv_multipartz%TestAsyncIOSocket.test_recv_multipartQ   s    	$ 			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                    K   j                  t        j                  t        j                        \  } }|j	                         }|j	                         }|j                         rJ |j                         rJ | j                  ddg       d {    | d {   }|j                         sJ |j                         dk(  sJ |dk(  sJ y 7 =7 5wNrM      there)rN   r   r?   rO   r   rQ   send_multipartresultrS   rT   f1f2rV   r"   s        r   rW   z)TestAsyncIOSocket.test_recv.<locals>.test]   s     ))#((CHH=DAqBBwwy =wwy =""E8#4555HE779999;%'''H$$$	 6s$   BCC	CC4CCrX   rY   s   ` r   	test_recvzTestAsyncIOSocket.test_recv\   s    
	% 			$$TV,r+   RCVTIMEOzrequires RCVTIMEO)reasonc                 P      fd} j                   j                   |              y )Nc                    K   j                  t        j                  t        j                        \  } }d|_        |j                         }d|_        |j                         }j                  t        j                        5  | d {    d d d        | j                  ddg       d {    | d {   }|j                         sJ |ddgk(  sJ y 7 M# 1 sw Y   LxY w7 87 0w)Nd     rM   r^   )rN   r   r?   rO   rcvtimeor   rP   assertRaisesAgainr_   rQ   ra   s        r   rW   z1TestAsyncIOSocket.test_recv_timeout.<locals>.testm   s     ))#((CHH=DAqAJBAJ!!#B""399- ""E8#4555HE7799UH----	  5sN   A?C(CC	CC(+C$,	C(5C&6 C(CC!C(&C(rX   rY   s   ` r   test_recv_timeoutz#TestAsyncIOSocket.test_recv_timeoutk   s    	. 			$$TV,r+   SNDTIMEOzrequires SNDTIMEOc                 P      fd} j                   j                   |              y )Nc                     K   j                  t        j                        } d| _        j	                  t        j
                        5  | j                  d       d {    d d d        y 7 # 1 sw Y   y xY ww)Nri   s   not going anywhere)r   r   r?   sndtimeorl   rm   rR   )rB   r"   s    r   rW   z1TestAsyncIOSocket.test_send_timeout.<locals>.test~   sb     CHH%AAJ""399- 4ff23334 434 4s0   AA:	A.A,A.#	A:,A..A73A:rX   rY   s   ` r   test_send_timeoutz#TestAsyncIOSocket.test_send_timeout|   s    	4 			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                  b  K   j                  t        j                  t        j                        \  } }|j	                         }|j                         rJ d}| j                  |       d {    | d {   }|j                         sJ |j                         |k(  sJ ||k(  sJ y 7 =7 5w)Nu   πøøπ)rN   r   r?   rO   recv_stringrQ   send_stringr`   )rS   rT   rU   msgrV   r"   s        r   rW   z0TestAsyncIOSocket.test_recv_string.<locals>.test   s     ))#((CHH=DAqAvvx<C--$$$GE668O888:$$$C<<	 %s$   A*B/-B+.	B/7B-84B/-B/rX   rY   s   ` r   test_recv_stringz"TestAsyncIOSocket.test_recv_string       		  			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                  v  K   j                  t        j                  t        j                        \  } }|j	                         }|j                         rJ t        d      }| j                  |       d {    | d {   }|j                         sJ |j                         |k(  sJ ||k(  sJ y 7 =7 5wN   rS   )	rN   r   r?   rO   	recv_jsonrQ   dict	send_jsonr`   rS   rT   rU   objrV   r"   s        r   rW   z.TestAsyncIOSocket.test_recv_json.<locals>.test   s     ))#((CHH=DAqAvvx<)C++c"""GE668O888:$$$C<<	 #$   A4B97B58	B9B74B97B9rX   rY   s   ` r   test_recv_jsonz TestAsyncIOSocket.test_recv_json   rz   r+   c                 P      fd} j                   j                   |              y )Nc                    K   j                  t        j                  t        j                        \  } }|j	                         }|j                         rJ |j                          t        j                  d       d {    t        d      }| j                  |       d {    t        j                  dk  r-t        j                  t              5  | d {   }d d d        n@t        j                  t        j                   j                        5  | d {   }d d d        |j                         sJ |j#                  d       d {   }|sJ t        j                  d       d {    |j	                         }t        j$                  |d       d {   }||k(  sJ y 7 .7 7 # 1 sw Y   xY w7 # 1 sw Y   xY w7 ~7 _7 2w)Nr   r~   r   )      r   )rN   r   r?   rO   r   rQ   cancelr   sleepr   r   r8   version_infopytestraisesr   
exceptionspollr   )rS   rT   rU   r   rV   eventsr"   s         r   rW   z8TestAsyncIOSocket.test_recv_json_cancelled.<locals>.test   so    ))#((CHH=DAqAvvx<HHJ--""")C++c"""&(]]>2 $"#GE$ $ ]]7#5#5#D#DE $"#GE$668O866!6,,FM6--"""A!**1a88EC<<% #" $$ $ $$ $ -" 9s   A<G?F- $G$F0%0GF5F3F5 6GGGG!/GG G1G2.G G!G0G3F55F>:GGGGGGrX   rY   s   ` r   test_recv_json_cancelledz*TestAsyncIOSocket.test_recv_json_cancelled   s    	 4 			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                  v  K   j                  t        j                  t        j                        \  } }|j	                         }|j                         rJ t        d      }| j                  |       d {    | d {   }|j                         sJ |j                         |k(  sJ ||k(  sJ y 7 =7 5wr}   )	rN   r   r?   rO   
recv_pyobjrQ   r   
send_pyobjr`   r   s        r   rW   z/TestAsyncIOSocket.test_recv_pyobj.<locals>.test   s     ))#((CHH=DAqAvvx<)C,,s###GE668O888:$$$C<<	 $r   rX   rY   s   ` r   test_recv_pyobjz!TestAsyncIOSocket.test_recv_pyobj   rz   r+   c                 d     d d  fd} j                   j                   |              y )Nc                     g }|j                  | j                  dg              t        j                  | d         j	                  d      }|j                  |       |S )N
identitiescontentutf8)extendgetjsondumpsencodeappend)rx   framesr   s      r   	serializez:TestAsyncIOSocket.test_custom_serialize.<locals>.serialize   sL    FMM#'',34jjY077?GMM'"Mr+   c                 d    | d d }t        j                  | d   j                  d            }||dS )Nr   )r   r   )r   loadsdecode)r   r   r   s      r   deserializez<TestAsyncIOSocket.test_custom_serialize.<locals>.deserialize   s:    Jjj!2!26!:;G(" r+   c                    K   j                  t        j                  t        j                        \  } }ddddi}| j	                  |       d {    |j                         d {   }|d   |d   k(  sJ |d   sJ |j	                  |       d {    | j                         d {   }|d   |d   k(  sJ |d   rJ y 7 y7 b7 67 w)Nr   r~   beerS   rT   r   )rN   r   DEALERROUTERsend_serializedrecv_serialized)rS   rT   rx   rV   r2r   r"   r   s        r   rW   z5TestAsyncIOSocket.test_custom_serialize.<locals>.test   s     ))#**cjjADAq C ##C333++K88E#s9~555&&&##E9555((55Bi=C	N222,'''' 48 65sH   ACCC*C+-CCC1C2CCCCrX   )r"   rW   r   r   s   ` @@r   test_custom_serializez'TestAsyncIOSocket.test_custom_serialize   s(    			(& 			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                    K   j                  t        j                  t        j                        \  } }ddddi}t	        j
                  t              5  | j                  t        t        j                         d {    d d d        | j                  d       d {    t	        j
                  t              5  |j                  t        j                         d {    d d d        y 7 o# 1 sw Y   nxY w7 \7 # 1 sw Y   y xY ww)Nr   r~   r   r   s   not json)rN   r   r   r   r   r   	TypeErrorr   r   r   rR   r   r   )rS   rT   rx   r"   s      r   rW   z;TestAsyncIOSocket.test_custom_serialize_error.<locals>.test   s     ))#**cjjADAq C y) :''djj999: &&%%%y) 4''

3334 4 :: : &34 4sf   AD(C/=C->C/DC;D<#C?C= C?$	D-C//C84D=C??DDrX   rY   s   ` r   test_custom_serialize_errorz-TestAsyncIOSocket.test_custom_serialize_error   s    	4  			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                     K   j                  t        j                  t        j                        \  } }|j	                  t        j
                        }j                  t        j                        5  | d {    d d d        | j                  d       d {    |j                          d {    |j	                  t        j
                        }|j                         sJ | d {   }|dk(  sJ y 7 # 1 sw Y   xY w7 m7 W7 w)Ns   ping)rN   r   r?   rO   r   DONTWAITrl   rm   rR   r   rQ   )pushpullrU   rx   r"   s       r   rW   z2TestAsyncIOSocket.test_recv_dontwait.<locals>.test  s     //#((CJD$		#,,'A""399- ))G$$$))+		#,,'A668O8'C'>!>  $ s`   A0D3C<9C::C<>DDD2D
3:D-D.D:C<<DD
DDrX   rY   s   ` r   test_recv_dontwaitz$TestAsyncIOSocket.test_recv_dontwait  s    
	" 			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                    K   j                  t        j                  t        j                        \  } }|j	                         }|j                         }|j                         sJ |j                         sJ |j                         rJ | j                  ddg       d {    | d {   }|j                         sJ |j                         sJ |ddgk(  sJ y 7 <7 4wr]   )
rN   r   r?   rO   r   rP   r   rQ   r_   	cancelledra   s        r   rW   z0TestAsyncIOSocket.test_recv_cancel.<locals>.test  s     ))#((CHH=DAqB!!#B99;;7799wwy =""E8#4555HE<<>!>7799UH----	 6s$   BC"!C"	C"+C ,3C" C"rX   rY   s   ` r   test_recv_cancelz"TestAsyncIOSocket.test_recv_cancel  s    	. 			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                  t  K   j                  t        j                  t        j                        \  } }|j	                  d      }t        j                  d       d {    |j                         dk(  sJ |j	                  d      }|j                         rJ | d {   }|dk(  sJ |j	                  d      }|j                         rJ | j                  ddg       d {    | d {   }|t        j                  k(  sJ |j                          d {   }|ddgk(  sJ y 7 7 7 I7 A7 w)Nr   r   r   rj   rM   r^   )rN   r   r?   rO   r   r   r   r`   rQ   r_   POLLINrP   )rS   rT   rU   evtrV   r"   s        r   rW   z)TestAsyncIOSocket.test_poll.<locals>.test%  s    ))#((CHH=DAqq!A--"""88:?"?q!Avvx<'C!8O8t$Avvx<""E8#4555'C#**$$$**,,EUH---- #
  6,s\   AD8D. AD8"D0#AD8(D2)	D82D43,D8D6 D80D82D84D86D8rX   rY   s   ` r   	test_pollzTestAsyncIOSocket.test_poll$      	.( 			$$TV,r+   c                 P      fd} j                   j                   |              y )Nc                    K   t        j                         } d}| j                  t         j                        }| j                  t         j                        }j
                  j                  ||g       |j                  |       |j                  |       t        j                         }|j                  |t         j                         |j                  d      }|j                         rJ |j                  ddg       | d {   }||t         j                  fgk(  sJ |j!                         }|ddgk(  sJ y 7 6w)Nzinproc://testrj   r   rM   r^   )r   r   r   r?   rO   socketsr   bindconnectr   Pollerregisterr   r   rQ   r_   rP   )	rG   urlrS   rT   pollerrU   r   rV   r"   s	           r   rW   z5TestAsyncIOSocket.test_poll_base_socket.<locals>.test<  s     ++-C!C

388$A

388$ALLA'FF3KIIcN[[]FOOAszz*D)Avvx<eX./'CAszz?++++$$&EUH---- s   DE D>7E rX   rY   s   ` r   test_poll_base_socketz'TestAsyncIOSocket.test_poll_base_socket;  r   r+   c                 P      fd} j                   j                   |              y )Nc                  Z  K   j                  t        j                  t        j                        \  } }|j	                  d      }|j                          t        d      D ]1  }t        j                  d       d {    |j                         s1 n |j                         sJ y 7 +w)Nr   r   r~   r   )
rN   r   r?   rO   r   r!   ranger   r   r   )rS   rT   rU   _r"   s       r   rW   z:TestAsyncIOSocket.test_poll_on_closed_socket.<locals>.testS  s     ))#((CHH=DAqq!AGGI 1X mmA&&&;;= ;;= = 's   A:B+=B)>B+B+rX   rY   s   ` r   test_poll_on_closed_socketz,TestAsyncIOSocket.test_poll_on_closed_socketR  s    	! 			$$TV,r+   winz)Windows does not support polling on filesc                 ^    d }t        j                         }|j                   |              y )Nc                    K   t        j                         } t        j                         \  }}t        j                  |d      }t        j                  |d      }| j                  |t        j                         | j                  |t        j                         | j                  d       d {   }t        |      }|j                         |vsJ |j                         |v sJ ||j                            t        j                  k(  sJ | j                  |       |j                  d       |j                          | j                  d       d {   }t        |      }|j                         |v sJ ||j                            t        j                  k(  sJ |j                  d      dk(  sJ |j!                          |j!                          y 7 &7 w)Nrbwbr   r      xrj   )r   r   ospipefdopenr   r   r   POLLOUTr   r   fileno
unregisterwriteflushreadr!   )prwevtss       r   rW   z-TestAsyncIOSocket.test_poll_raw.<locals>.testh  sh    A779DAq		!T"A		!T"A JJq#**%JJq#++&**D:D88:T)))88:%%%
#s{{222 LLOGGDMGGI--D:D88:%%%
#szz11166!9$$$GGIGGI! + .s&   B-G/G0B$GGBGG)r   r   r   )r"   rW   r$   s      r   test_poll_rawzTestAsyncIOSocket.test_poll_rawc  s'    
	8 %%''r+   c                 4   | j                  t        j                  t        j                        \  fd}t	        d      D ]Q  }t        j                         }|j                  t        j                   |       d             |j                          S y )Nc                     K   j                  d       d {    j                          d {   } | dk(  sJ y 7 $7 w)Ns   buf)rR   r   )rx   rS   rT   s    r   rW   z3TestAsyncIOSocket.test_multiple_loops.<locals>.test  s:     &&.  .C&= = ! s   A=A?AAr   
   r   )
rN   r   r?   rO   r   r   r   r   r   r!   )r"   rW   ir$   rS   rT   s       @@r   test_multiple_loopsz%TestAsyncIOSocket.test_multiple_loops  so    %%chh91	!
 q 	A))+D##G$4$4TVR$HIJJL	r+   c                       fd}y )Nc                     K   t        j                         } | j                  t         j                        }t	        j
                  |      }t        |j                        sJ y wr   )r   r   r   rO   r   rA   r@   socket_class)rG   rB   async_sr"   s      r   rW   z+TestAsyncIOSocket.test_shadow.<locals>.test  sG     ++-C

388$Akk!nGgt'8'8999s   A"A%r*   rY   s   ` r   test_shadowzTestAsyncIOSocket.test_shadow  s    	:r+   c                    t               }|j                          	 |j                  d       | j                  |j                  d|j                  rd|j                  z  nd       |j                          y # |j                          w xY w)Nr   r   z Python process died with code %dzprocess teardown hangs)r
   startjoinassertEqualexitcode	terminate)r"   procs     r   test_process_teardownz'TestAsyncIOSocket.test_process_teardown  sj    %'


	IIbM== 3T]]B- NNDNNs   A	A6 6B)&r'   r(   r)   r   r   r1   r6   rC   rH   rJ   rZ   rd   r   skipifhasattrr   rn   rs   ry   r   r   r   r   r   r   r   r   r   r   r   r8   platform
startswithr   r   r   r   __classcell__r3   s   @r   r-   r-   -   s   llGB
11	-- T[[WS*--6IJ- K-  T[[WS*--6IJ- K----:-#-J-&-- -.-.-" [[&:  (	(@:r+   r-   c                   h     e Zd ZdZej
                  Zd Z fdZd Z fdZ	d Z
d Zd Zd	 Z xZS )
TestAsyncioAuthenticationz-Test authentication running in a asyncio taskc                     | j                   }|rE|j                  d      d   j                         }|j                  d      r|j	                  dd      }|S )z`Rewrite doc strings from TestThreadAuthentication from
        'threaded' to 'asyncio'.
        
r   zthreaded authzasyncio auth)_testMethodDocsplitstripr   replace)r"   docs     r   shortDescriptionz*TestAsyncioAuthentication.shortDescription  sN     !!))D/!$**,C~~o.kk/>B
r+   c                 T    t        j                         | _        t        |           y r   r/   r2   s    r   r1   zTestAsyncioAuthentication.setUp  r4   r+   c                 P      fd} j                   j                   |              y )Nc                  B   K    j                   j                          y wr   )authr   r"   s   r   r   z3TestAsyncioAuthentication.start_auth.<locals>.start  s     IIOOs   rX   )r"   r   s   ` r   
start_authz$TestAsyncioAuthentication.start_auth  s    	 			$$UW-r+   c                 V    t         |           | j                  j                          y r   )r0   r6   r$   r!   r2   s    r   r6   z"TestAsyncioAuthentication.tearDown  s    		r+   c                 ,    t        | j                        S r   )r   r>   r  s    r   	make_authz#TestAsyncioAuthentication.make_auth  s    #DLL11r+   c                 R    fd}| j                   j                   |             S )z9Check if client can connect to server using tcp transportc                  l  K   d} d}j                  |      }j                  d||fz         dg}dx_        _        	 j	                  |       d {    	 j                          d {   }||k(  sJ d} | S 7 (# t
        j                  $ r Y yw xY w7 *# t
        j                  $ r Y yw xY ww)NFr   z%s:%is   Hello Worldrj   T)r   r   ro   re   r_   r   rm   rP   )r`   ifaceportrx   rcvd_msgclientservers        r   goz1TestAsyncioAuthentication.can_connect.<locals>.go  s     F%E--e4DNN7eT]23!"C 154FOfo++C000!'!6!6!88  3&M 199  999 sk   =B4B  A>B  B .B/B 3B4>B   BB4BB4B B1.B40B11B4rX   )r"   r  r  r  s    `` r   can_connectz%TestAsyncioAuthentication.can_connect  s!    	, yy++BD11r+   c                 V    fd}| j                   j                   |             S )Nc                  D   K    j                    i  d {   S 7 wr   )rR   )argskwargsr   s   r   _sendz-TestAsyncioAuthentication.send.<locals>._send  s#     $d5f5555s     rX   )r"   r   r!  r"  r#  s    ``` r   rR   zTestAsyncioAuthentication.send  s!    	6 yy++EG44r+   c                     |rj                   nj                  fd}| j                  j                   |             S )Nc                  |   K   j                  d       d {   st        d       di   d {   S 7 7 w)Ni  zShould have received a messager*   )r   r    )r"  r   r   s   r   r%   z4TestAsyncioAuthentication._select_recv.<locals>.coro  s=     T***"#CDD'' +'s   <8<:<<)rP   r   r$   r   )r"   	multipartr   r"  r%   r   s     `` @r   _select_recvz&TestAsyncioAuthentication._select_recv  s4    (1v$$v{{	(
 yy++DF33r+   )r'   r(   r)   __doc__r   r   r  r1   r  r6   r  r  rR   r'  r  r  s   @r   r  r    s7    7llG	.22654r+   r  )r(  r   r   r   r8   concurrent.futuresr   multiprocessingr   r   r   r   zmq.asyncior   zmq.auth.asyncior   	zmq.testsr   zmq.tests.test_authr   r
   r-   r  r*   r+   r   <module>r/     s[       	 
 - #   
  1 % 8W .{ {|J4 8 J4r+   