B
    18\#                 @   s   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Zd dlm	Z	 d dl
mZmZmZmZmZmZmZmZmZ dd Zdd Zdd	d
ddZG dd dZG dd dZG dd dejZedd Zedkre  dS )    N)mock)	verboseimport_modulerun_unittestTESTFNreap_threadsforgetunlinkrmtreestart_threadsc       	   
   C   s   zvy>t |d r"dd l}dd l}ndd l}dd l}|dd}W n2 tk
rr } z||d  W d d }~X Y nX W d |t  t || k}|r|	  X d S )N   r         )
lenmodulefinderrandom	randrange	Exceptionappendwith_traceback	threading	get_identset)	Ndone
done_taskserrorsr   r   xefinished r    ]/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_threaded_import.pytask   s    
&r"   c             C   s   t jddd| S )Nzos.register_at_forkT)Zcreate)r   patch)funcr    r    r!   mock_register_at_fork)   s    r%   zaif 1:
        import time
        time.sleep(%(delay)s)
        x = 'a'
        import C
        zaif 1:
        import time
        time.sleep(%(delay)s)
        x = 'b'
        import D
        zimport Bzimport A)ABCDc               @   s"   e Zd ZdZdd ZdddZdS )FinderzIA dummy finder to detect concurrent access to its find_spec()
    method.c             C   s   d| _ d| _t | _d S )Nr   )numcallsr   r   Locklock)selfr    r    r!   __init__G   s    zFinder.__init__Nc          	   C   sJ   t  st| j |  jd7  _W d Q R X | j}td |d | _d S )Nr   g{Gz?)imp	lock_heldAssertionErrorr-   r+   r   timesleep)r.   namepathtargetr   r    r    r!   	find_specL   s    
zFinder.find_spec)NN)__name__
__module____qualname____doc__r/   r8   r    r    r    r!   r*   C   s   r*   c               @   s   e Zd ZdZdddZdS )FlushingFinderzMA dummy finder which flushes sys.path_importer_cache when it gets
    called.Nc             C   s   t j  d S )N)syspath_importer_cacheclear)r.   r5   r6   r7   r    r    r!   r8   [   s    zFlushingFinder.find_spec)NN)r9   r:   r;   r<   r8   r    r    r    r!   r=   W   s   r=   c               @   s\   e Zd Zdd Zdd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd Zedd ZdS )ThreadedImportTestsc             C   s   t jdd | _d S )Nr   )r>   modulespop
old_random)r.   r    r    r!   setUpa   s    zThreadedImportTests.setUpc             C   s   | j d k	r| j tjd< d S )Nr   )rD   r>   rB   )r.   r    r    r!   tearDownd   s    
zThreadedImportTests.tearDownc          
      s  t  rtdt xdD ] tr8td ddd x.dD ]&}ytj	|= W q> t
k
rb   Y q>X q>W g g   t }t fdd	t D  W d Q R X d
}t | }trtd|d  ddd dt f }| | | || tr td q W d S )Nz"can't run when import lock is held)   2   rG   rH   rG   rH   ZTryingzthreads ... )end)r   r   c             3   s$   | ]}t jt fd V  qdS ))r7   argsN)r   Threadr"   ).0i)r   r   r   r   r    r!   	<genexpr>   s   zAThreadedImportTests.check_parallel_module_init.<locals>.<genexpr>iX  z%.1f msg     @@T)flushrJ   zdone: %s/%szOK.)r0   r1   unittestSkipTestr   Eventr   printr>   rB   KeyErrorr@   r3   	monotonicr   rangewaitr   assertFalse
assertTrue)r.   mock_osmodnamet0	completeddtZdbg_infor    )r   r   r   r   r!   check_parallel_module_initk   s6    





z.ThreadedImportTests.check_parallel_module_initc             C   s   |    d S )N)r`   )r.   r    r    r!   test_parallel_module_init   s    z-ThreadedImportTests.test_parallel_module_initc          	   C   sR   t  }tjd| z*|   | |jd | |j|j W d tj	| X d S )Nr   )
r*   r>   	meta_pathinsertr`   assertGreaterr+   assertEqualr   remove)r.   finderr    r    r!   test_parallel_meta_path   s    z+ThreadedImportTests.test_parallel_meta_pathc          	      s   t   t } fdd}tjd| tj| z4|d |  }| 	 j
d |  j j
 W d tj| tj| X d S )Nc                s     d td S )N )r8   ImportError)r6   )rg   r    r!   	path_hook   s    
z?ThreadedImportTests.test_parallel_path_hooks.<locals>.path_hookr   ri   )r*   r=   r>   
path_hooksrc   rb   r   r8   r`   rd   r+   re   r   rf   )r.   Zflushing_finderrk   Znumtestsr    )rg   r!   test_parallel_path_hooks   s    
z,ThreadedImportTests.test_parallel_path_hooksc             C   s<   yt jd= W n tk
r    Y nX dd l}| |jj d S )Nztest.threaded_import_hangersr   )r>   rB   rU   Ztest.threaded_import_hangersrY   Zthreaded_import_hangersr   )r.   testr    r    r!   test_import_hangers   s    z'ThreadedImportTests.test_import_hangersc       	   
      s  d}t t | tjt tjdt | tjj	t x`t
 D ]T\}}|d|i }tt jt|d d}||d W d Q R X | t| qDW t  g   fdd} fd	d
}tj|d}tj|d}|  |  |  |  | t ddh d S )Ng      ?r   delayz.pywbzutf-8c                 s   dd l }  t| dd  d S )Nr   r   )r&   r   getattr)r&   )resultsr    r!   	import_ab   s    z<ThreadedImportTests.test_circular_imports.<locals>.import_abc                 s   dd l }  t| dd  d S )Nr   r   )r'   r   rr   )r'   )rs   r    r!   	import_ba   s    z<ThreadedImportTests.test_circular_imports.<locals>.import_ba)r7   ab)osmkdirr   
addCleanupshutilr
   r>   r6   rc   rf   circular_imports_modulesitemsopenjoinwriteencoder   	importlibinvalidate_cachesr   rL   startre   r   )	r.   rp   r5   contentsfrt   ru   t1t2r    )rs   r!   test_circular_imports   s*    
z)ThreadedImportTests.test_circular_importsc          	   C   s   d}t jdtj | t jjtj td }t|d}|	|
d W d Q R X | t| | tt | td t  tt t jt= d S )Nzif 1:
            import threading
            def target():
                import random
            t = threading.Thread(target=target)
            t.start()
            t.join()
            t = Noner   z.pyrq   zutf-8__pycache__)r>   r6   rc   rx   curdirrz   rf   r   r~   r   r   r	   r   r
   r   r   
__import__rB   )r.   r[   codefilenamer   r    r    r!   test_side_effect_import   s    	z+ThreadedImportTests.test_side_effect_importN)r9   r:   r;   rE   rF   r%   r`   ra   rh   rm   ro   r   r   r    r    r    r!   rA   _   s   "

&rA   c           	   C   sV   d } yt  } t d W n tk
r.   Y nX ztt W d | d k	rPt |  X d S )Ngh㈵>)r>   getswitchintervalsetswitchintervalAttributeErrorr   rA   )Zold_switchintervalr    r    r!   	test_main   s    r   __main__)_impr0   rx   r   r>   r3   r{   r   rQ   r   Ztest.supportr   r   r   r   r   r   r	   r
   r   r"   r%   r|   r*   r=   TestCaserA   r   r9   r    r    r    r!   <module>   s,   , 