B
    H/\                 @   s   d dl mZmZ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m	Z	 d dlm
Z d dlmZ d dlmZ d d	lmZ G d
d dejZeeeddG dd deZeeeddG dd dejZedkre  dS )    )print_functionabsolute_importdivisionN)pipe)os)Greenletjoinall)testing)mock)six)skipOnLibuvOnPyPyOnWinc               @   sn   e Zd ZejZdd Zeej	Z
eejZeddd Zejd dk rPdd	 Zejd
d dkrjdd Zd
S )	TestOS_tpc             C   s   t  S )N)r   )self r   4lib/python3.7/site-packages/gevent/tests/test__os.pyr      s    zTestOS_tp.pipezSometimes times outc                s     \dd}|| dgdg fdd}fdd}t|}|  t|}|d t||g d  d d  d S )	Ni@B s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr   c                 sH   xBd krBd  } d    d t| d 7  < qW d S )Nr   i   )writemin)	bytesleft)bufbyteswrittennbytesr   wr   r   produce&   s    z/TestOS_tp._test_if_pipe_blocks.<locals>.producec           
      sD   x> d kr> d  }  d  t t| d7  < qW d S )Nr   i   )lenreadr   )r   )	bytesreadr   rr   r   r   consume+   s    z/TestOS_tp._test_if_pipe_blocks.<locals>.consume   )r   r   startZstart_laterr   assertEqual)r   Zbuffer_classblockr   r   ZproducerZconsumerr   )r   r   r   r   r   r   r   r   _test_if_pipe_blocks   s    
zTestOS_tp._test_if_pipe_blocksr      c             C   s   |  tjj d S )N)r"   r   builtinsbuffer)r   r   r   r   test_if_pipe_blocks_buffer=   s    z$TestOS_tp.test_if_pipe_blocks_bufferN   )r'      c             C   s   |  tjj d S )N)r"   r   r$   
memoryview)r   r   r   r   test_if_pipe_blocks_memoryviewB   s    z(TestOS_tp.test_if_pipe_blocks_memoryview)__name__
__module____qualname__	greentestLARGE_TIMEOUT__timeout__r   staticmethodr   Ztp_readr   Ztp_writer   r   r"   sysversion_infor&   r*   r   r   r   r   r      s   

 r   make_nonblockingzOnly on POSIXc                   s   e Zd Zdd Zdd Z fddZdd Zd	d
 Zdd Zdd Z	e
de
ddd Ze
de
ddd Ze
de
ddd Ze
de
ddd Z  ZS )	TestOS_nbc             C   s   t ||S )N)r   nb_read)r   fdcountr   r   r   r   J   s    zTestOS_nb.readc             C   s   t ||S )N)r   nb_write)r   r7   r8   r   r   r   r   M   s    zTestOS_nb.writec                s.   t t|  \}}t| t| ||fS )N)superr5   r   r   r4   )r   r   r   )	__class__r   r   r   P   s    

zTestOS_nb.pipec             C   s   dd l }t }|j|_ |S )Nr   )errnoOSErrorZEINTR)r   r<   Zignored_oserrorr   r   r   _make_ignored_oserrorV   s    zTestOS_nb._make_ignored_oserrorc             C   s6   |   |j}|jj}| || |j}|j   d S )N)Zassert_called_once_withZreturn_valueZloopioclose)r   mock_get_hubr7   eventZhubr?   r   r   r   _check_hub_event_closed]   s    z!TestOS_nb._check_hub_event_closedc             C   s:   |   dg|_d}|||}| |d | ||| d S )N*   d   )r>   side_effectr    rC   )r   nb_funcnb_argmock_iorA   rB   r7   resultr   r   r   _test_event_closed_on_normal_iof   s
    
z)TestOS_nb._test_event_closed_on_normal_ioc          	   C   sF   |   t g|_d}| t ||| W d Q R X | ||| d S )NrE   )r>   
ValueErrorrF   assertRaisesrC   )r   rG   rH   rI   rA   rB   r7   r   r   r   _test_event_closed_on_io_errorp   s
    z(TestOS_nb._test_event_closed_on_io_errorzgevent.os.get_hubzgevent.os._writec             C   s   |  tjd||d d S )Ns   bufr'   )rK   r   r9   )r   
mock_writerA   r   r   r   test_event_closed_on_write{   s    
z$TestOS_nb.test_event_closed_on_writec             C   s   |  tjd||d d S )Ns   bufr'   )rN   r   r9   )r   rO   rA   r   r   r    test_event_closed_on_write_error   s    
z*TestOS_nb.test_event_closed_on_write_errorzgevent.os._readc             C   s   |  tjd||d d S )Ns   bufr   )rK   r   r6   )r   	mock_readrA   r   r   r   test_event_closed_on_read   s    
z#TestOS_nb.test_event_closed_on_readc             C   s   |  tjd||d d S )Ns   bufr   )rN   r   r6   )r   rR   rA   r   r   r   test_event_closed_on_read_error   s    
z)TestOS_nb.test_event_closed_on_read_error)r+   r,   r-   r   r   r   r>   rC   rK   rN   r
   ZpatchrP   rQ   rS   rT   __classcell__r   r   )r;   r   r5   F   s   	
r5   fork_and_watchc               @   s*   e Zd ZejZdd Zdd Zdd ZdS )TestForkAndWatchc             C   s<   t  }|r$t dd t d ntd t d d S )Nr   r'   )r   rV   waitpidZ_reap_childrengeventZsleep_exit)r   pidr   r   r   test_waitpid_all   s    
z!TestForkAndWatch.test_waitpid_allc             C   s   |  ttjdd d S )Nr   )rM   r=   r   rY   )r   r   r   r   test_waitpid_wrong_neg   s    z'TestForkAndWatch.test_waitpid_wrong_negc             C   s   |  ttjdd d S )Nr   r   )rM   r=   r   rY   )r   r   r   r   test_waitpid_wrong_pos   s    z'TestForkAndWatch.test_waitpid_wrong_posN)	r+   r,   r-   r.   r/   r0   r]   r_   r`   r   r   r   r   rW      s   rW   __main__)Z
__future__r   r   r   r2   r   r   rZ   r   r   r	   r.   Zgevent.testingr
   r   Zgevent.testing.skippingr   ZTestCaser   Z
skipUnlesshasattrr5   rW   r+   mainr   r   r   r   <module>   s$   5P
