U
    ‰ª/e>  ã                   @   s  d 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	m
Z
 ddlmZ ddlZddlZddlmZ ddlmZmZmZmZ ejdd„ ƒZej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j j!ej" #d¡dddd„ ƒZ$dS )zTest IO capturing functionalityé    N)ÚFutureÚThreadPoolExecutor)Úmock)ÚSession)ÚMASTERÚBackgroundSocketÚIOPubThreadÚ	OutStreamc                  c   s   t  ¡ } | V  |  ¡  d S ©N)ÚzmqÚContextÚdestroy)Úctx© r   ú;/tmp/pip-unpacked-wheel-g43y689f/ipykernel/tests/test_io.pyr      s    r   c              	   c   sB   |   tj¡,}t|ƒ}| ¡  |V  | ¡  | ¡  W 5 Q R X d S r
   )Úsocketr   ZPUBr   ÚstartÚstopÚclose)r   ÚpubÚthreadr   r   r   Úiopub_thread   s    r   c              	   C   s  t ƒ }t|| dƒ}|jdks t‚| ¡ r,t‚t tj¡ | 	¡  W 5 Q R X t tj¡ t
|ƒ W 5 Q R X t tj¡ | ¡  W 5 Q R X t tj¡ | ¡  W 5 Q R X t tj¡ | d¡ W 5 Q R X t tj¡ | ¡  W 5 Q R X t t¡ | d¡ W 5 Q R X dS )zCTest that wrapped stdout has the same API as a normal TextIO objectÚstdoutNr   ó    )r   r	   ÚerrorsÚAssertionErrorÚisattyÚpytestÚraisesÚioÚUnsupportedOperationÚdetachÚnextÚreadÚreadlineÚseekÚtellÚ	TypeErrorÚwrite©r   ÚsessionÚstreamr   r   r   Útest_io_api&   s$    r,   c                 C   s&   t ƒ }t|| ddd}| ¡ s"t‚d S )Nr   T)r   )r   r	   r   r   r)   r   r   r   Útest_io_isatty=   s    r-   c                 C   sz   | }|  ¡  |jdg}| |¡ | ¡ \}}| ¡  |j ¡  dd„ |_| dg¡ | ¡  | ¡  | ¡  | d ¡ d S )Nó   ac                   S   s   t S r
   )r   r   r   r   r   Ú<lambda>K   r   z test_io_thread.<locals>.<lambda>ó   hi)	Z_setup_pipe_inZ
_pipe_uuidZ_handle_pipe_msgZ_setup_pipe_outr   Z_pipe_inZ_check_mp_modeZ_really_sendr   )r   r   ÚmsgZctx1Úpiper   r   r   Útest_io_threadC   s    



r3   c              	   C   sh   t | ƒ}|jt kst‚t ¡ ( t dt¡ d|_| jjdksBt‚W 5 Q R X |j	| ksZt‚| 
d¡ d S )NÚignoreée   r0   )r   Ú	__class__r   ÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningZlingerr   Z	io_threadÚsend)r   Úsockr   r   r   Útest_background_socketS   s    
r=   c              
   C   sð   t ƒ }| j}t ¡ X t dt¡ t||dƒ}| ¡  t|| dtƒ d}| ¡  t|| ddd}| ¡  W 5 Q R X t|| ddt	 
¡ d}|Z t t	j¡ | ¡  W 5 Q R X | ¡  | ¡  | d¡ | d	d
g¡ | ¡ sât‚W 5 Q R X d S )Nr4   r   )r2   F)ÚwatchfdT)r   ÚechoÚhiÚabZcd)r   r   r7   r8   r9   r:   r	   r   Úobjectr   ÚStringIOr   r   r    ÚfilenoZ_watch_pipe_fdÚflushr(   Ú
writelinesÚwritabler   )r   r*   r   r+   r   r   r   Útest_outstream^   s&    

rH   c                 ƒ   sÞ   t dd}t|ˆdddd}tj}ˆji ks0t‚|j tj td|¡N t	dƒ:}| 
td¡ ¡  | 
tj¡ ¡ }tˆjƒ|gks†t‚W 5 Q R X W 5 Q R X W 5 Q R X tƒ ‰ ‡ ‡fd	d
„}ˆj |¡ ˆ  ¡  ˆji ksÚt‚d S )Nó   abc©Úkeyr   TF)r   r>   é   Úxc               
   “   sN   zˆ  ¡ I d H  W n, tk
r> }  zˆ  | ¡ W 5 d } ~ X Y nX ˆ  d ¡ d S r
   )Z_event_pipe_gcÚ	ExceptionZset_exceptionZ
set_result)Úe©Úfr   r   r   Úrun_gcŠ   s
    z"test_event_pipe_gc.<locals>.run_gc)r   r	   Úsysr   Z_event_pipesr   r   ÚpatchrB   r   ZsubmitÚprintÚresultÚ	threadingÚcurrent_threadÚlistr   Zio_loopZadd_callback)r   r*   r+   Úsave_stdoutÚpoolZpool_threadrR   r   rP   r   Útest_event_pipe_gcw   s&    
û"2r\   c                  C   s:  t dd} t ¡ }| tj¡}| tjd ¡ t|ƒ}| 	¡  t
j ¡ }t
j ¡  t| |ddt
jdd}t
j}|’ tj t
d|¡v t |d¡ td	d
d t
j ¡  t
j d¡ t
j ¡  | d¡ | ¡  t |d¡}| ¡  t d¡ | ¡  W 5 Q R X W 5 Q R X | ¡  | ¡  W 5 Q R X W 5 Q R X d S )NrI   rJ   Ú	IOPUB_URLr   TÚforce)r   r?   r>   s   fd
zprint
Ú )Úendz__stdout__
zstdout
ÚwrL   )r   r   r   r   ZPUSHÚconnectÚosÚenvironr   r   rS   r   rD   rE   r	   r   rT   rB   r(   rU   Ú
__stdout__ÚfdopenÚtimeÚsleepr   r   )r*   r   r   r   Z	stdout_fdr+   rZ   Zfd_filer   r   r   Úsubprocess_test_echo_watch˜   s<    


ú



ri   ÚwinÚWindows)Úreasonc              	   C   sv  |   tj¡}| d¡}d|› }tdd}g }g }|æ ttjƒ}||d< d|d< | dd	¡ t	j
tjd
dt› dt› dg|dddd}td|j›ƒ t|j› dtjd |jdks¼t‚|jddr| |¡\}	}
|
d	k	sät‚|
d d dkr¼|
d d dkr¼| |
d d ¡ q¼W 5 Q R X d |¡}t| ¡  ¡ ƒdd dd!hksNt‚t|j ¡  ¡ ƒdd dd!hksrt‚d	S )"z‰Test echo on underlying FD while capturing the same FD

    Test runs in a subprocess to avoid messing with pytest output capturing.
    ztcp://127.0.0.1ztcp://127.0.0.1:rI   rJ   r]   Ú1ZPYTHONUNBUFFEREDZPYTEST_CURRENT_TESTNz-czimport z; z.subprocess_test_echo_watch()Té
   )ÚenvÚcapture_outputÚtextÚtimeoutz	p.stdout=ú=)Úfiler   éd   )rr   ÚheaderÚmsg_typer+   ÚcontentÚnamer   rq   r_   ÚfdrU   re   )r   r   ZPULLZbind_to_random_portr   Údictrc   rd   ÚpopÚ
subprocessÚrunrS   Ú
executableÚ__name__rU   r   ÚstderrÚ
returncoder   ÚpollÚrecvÚappendÚjoinÚsetÚstripÚ
splitlines)r   ÚsÚportÚurlr*   ÚmessagesZstdout_chunksro   ÚpÚidentr1   Z
zmq_stdoutr   r   r   Útest_echo_watchÂ   sT    



ý÷ 
ü	ür   )%Ú__doc__r   rc   r}   rS   rW   rg   r7   Úconcurrent.futuresr   r   Zunittestr   r   r   Zjupyter_client.sessionr   Zipykernel.iostreamr   r   r   r	   Zfixturer   r   r,   r-   r3   r=   rH   r\   ri   ÚmarkZskipifÚplatformÚ
startswithr   r   r   r   r   Ú<module>   s4   


!*