o
    _{i	                    @   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	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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 d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  e!d	Z"e!d
 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, zd dl$m-Z- e-j.Z/W n e0y   dZ/Y nw zd dl1m2Z2m3Z3 dZ4W n e0y   dZ4Y nw z
d dl$m5Z5 dZ6W n e0y   dZ6Y nw zd dl7Z7W n e0y   dZ7Y nw e8edr$ej9ddr$e :de;dddZ<e	j=>dr3dndZ?dd Z@dd ZAdd ZBe	jCdkrQd dl$mDZD d d! ZEe,jFZGd"ZHdZIeIrad#\ZJZKZLnd$\ZJZKZLeMe"d%d ZNejOd&kZPd d'l&mQZQ d(d) ZRze	Sd*ZTW n   d+ZTY d,d-gZUzd d.lVmWZWmXZXmYZYmZZZ W n e0y   e[ZWd ZX ZYZZY nw d/d0 Z\G d1d2 d2e[Z]G d3d4 d4e[Z^d5d6 Z_G d7d8 d8Z`G d9d: d:e^ZaG d;d< d<e%jbZcG d=d> d>e^Zdd?d@ ZedAdB ZfG dCdD dDe^ZgG dEdF dFe^ZhG dGdH dHe^ZiG dIdJ dJe^ZjG dKdL dLe^ZkG dMdN dNe[ZldOdP ZmG dQdR dRe[ZnG dSdT dTe[ZoG dUdV dVe^ZpG dWdX dXe^ZqG dYdZ dZe^ZrG d[d\ d\e^Zsdd^d_Ztd`da Zudbdc Zvddde ZwG dfdg dge[ZxG dhdi dieyZzdjdk Z{G dldm dme^Z|dndo Z}dpdq Z~G drds dse^ZG dtdu due^Zd dvl)mZmZmZ G dwdx dxe[Zdydz ZG d{d| d|eZG d}d~ d~eZejded ejdedd ejdzeed G dd de^Ze Zdd ZG dd deZejded G dd deZed dZG dd de^ZedG dd de^Ze@dZG dd de^ZG dd de^ZG dd de^ZG dd de^Ze e/dedG dd de^ZG dd de^ZG dd deWZG dd de^Ze e6dedG dd de^ZG dd de^ZG dd de jZG dd de^ZG dd de^ZG dd de jZedG dd de jZdd ZedG dd de jZdd Zdd Zdd Zdd ZG dd de[ZG ddÄ de jZG ddń de jZG ddǄ de jZG ddɄ de jZG dd˄ de jZG dd̈́ de jZG ddτ de jZG ddф de jZG ddӄ de jZG ddՄ de jZe ejOd&kd֡G dd؄ de jZG ddڄ de jZG dd܄ de jZedG ddބ de jZG dd de jZG dd de jZG dd de[ZG dd deZG dd deZG dd deZdd Ze e8e"d de ejOdkde ejdkdG dd de jZdS )    N)support)hashlib_helper)import_helper)	os_helper)socket_helper)threading_helper)warnings_helper_multiprocessingzmultiprocess.synchronize)util)	reductionF)ValuecopyT)shared_memorycheck_sanitizer)addressz(libasan has a pthread_create() dead lock)
__cleanenv
__isolatedCOVERAGEg     V@g      N@c                 C   
   |  dS )Nlatin)encode)s r   O/home/ubuntu/.local/lib/python3.10/site-packages/multiprocess/tests/__init__.pyr   Y      
r   c                 C   s&   t | tjjr|   |   d S d S N)
isinstancemultiprocessingqueuesQueueclosejoin_threadqueuer   r   r   close_queue]   s   r$   c                 C   s   t j| td d S Ntimeout)r   r!   TIMEOUT)processr   r   r   join_processc   s   r*   posix)resource_trackerc                 C   s   t j| |  d S r   )r,   _CLEANUP_FUNCS)namertyper   r   r   _resource_unlinkl      r0   皙?)g=
ףp=?gffffff?gffffff?)r2   r2   r2   HAVE_BROKEN_SEM_GETVALUEwin32waitc                 C   s    |d ur
|dk r
d }t | g|S )N        r5   )handler'   r   r   r   wait_for_handle   s   r9   SC_OPEN_MAX   __main__test_multiprocessing_forkserver)	Structurec_intc_double
c_longlongc               	   C   sN   d} zt d}W n ttfy   Y dS w |dks|| kr dS td|  )zACheck that the system supports enough semaphores to run the test.r;   SC_SEM_NSEMS_MAXNzHThe OS doesn't support enough semaphores to run the test (required: %d).)ossysconfAttributeError
ValueErrorunittestSkipTest)	nsems_minnsemsr   r   r   check_enough_semaphores   s   rL   c                   @      e Zd Zdd Zdd ZdS )TimingWrapperc                 C      || _ d | _d S r   )funcelapsed)selfrP   r   r   r   __init__      
zTimingWrapper.__init__c                 O   s:   t  }z| j|i |W t  | | _S t  | | _w r   )time	monotonicrP   rQ   )rR   argskwdstr   r   r   __call__   s    zTimingWrapper.__call__N__name__
__module____qualname__rS   rZ   r   r   r   r   rN      s    rN   c                   @   s,   e Zd ZdZdd Zdd Zdd ZeZdS )	BaseTestCase)	processesmanagerthreadsc                 C   s   t r| ||d d S d S N   )CHECK_TIMINGSassertAlmostEqualrR   abr   r   r   assertTimingAlmostEqual   s   z$BaseTestCase.assertTimingAlmostEqualc                 G   s.   z|| }W n
 t y   Y d S w | ||S r   )NotImplementedErrorassertEqual)rR   valuerP   rW   resr   r   r   assertReturnsIfImplemented   s   z'BaseTestCase.assertReturnsIfImplementedc                 G      t d)Nz#shouldn't try to pickle a test case)rk   )rR   rW   r   r   r   
__reduce__      zBaseTestCase.__reduce__N)r\   r]   r^   ALLOWED_TYPESrj   ro   rq   __reduce_ex__r   r   r   r   r_      s    
r_   c                 C   sZ   z|   W S  ty,   z| jW  Y S  ty+   z| jW  Y  Y S  ty*   tw w w r   )	get_valuerF   _Semaphore__value_valuerk   rR   r   r   r   ru      s   
ru   c                   @      e Zd Zdd ZdS )DummyCallablec                 C   s   t |tsJ |d d S N   )r   rz   put)rR   qcr   r   r   rZ      s   zDummyCallable.__call__N)r\   r]   r^   rZ   r   r   r   r   rz          rz   c                   @   s  e Zd ZdZdd Zdd Zedd Zdd	 Zed
d Z	dd Z
edd Zedd Zdd Zeejddd Zedd Ze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ed)d*d+d, Zed-d. Zd/d0 ZedRd3d4Z d5d6 Z!d7d8 Z"d9d: Z#ed;d< Z$d=d> Z%ed?d@ Z&dAdB Z'ei fdCdDZ(dEdF Z)dGdH Z*edSdJdKZ+dLdM Z,dNdO Z-dPdQ Z.d2S )T_TestProcessr`   rb   c                 C   s   | j dkr| d| j  |  }|j}| |  | |j  | |t	 | t
|dk | |jt  | |jd  d S )Nrb   test not appropriate for {}r   )TYPEskipTestformatcurrent_processauthkey
assertTrueis_alivedaemonassertIsInstancebyteslenrl   identrD   getpidexitcode)rR   currentr   r   r   r   test_current   s   
z_TestProcess.test_currentc                 C   sz   | j dkr| d| j  | j| jd}| |j|  j | j| jdd}| |j | j| jdd}| 	|j d S )Nrb   r   targetTr   r   F)
r   r   r   Process_testrl   r   r   r   assertFalse)rR   proc0proc1proc2r   r   r   test_daemon_argument  s   
z!_TestProcess.test_daemon_argumentc                 O   sV   |   }|| || ||j | jdkr)|t|j ||j d S d S )Nrb   )r   r}   r.   r   r   r   pid)clsr~   rW   rX   r   r   r   r   r     s   


z_TestProcess._testc                 C   s   | j dkr| d| j  | |   | jdd\}}| j| j|fd}|  |	  |
 \}}| ||  j | |t  | ||  j d S )Nrb   r   Fduplexr   rW   )r   r   r   assertIsNoneparent_processPiper   _test_send_parent_processstartjoinrecvrl   r   r   rD   r   r.   )rR   rconnwconnp
parent_pidparent_namer   r   r   test_parent_process_attributes  s   
z+_TestProcess.test_parent_process_attributesc                 C   s&   ddl m} || j| jg d S )Nr   r   )multiprocess.processr   sendr   r.   r   r   r   r   r   r   r   ,  s   z&_TestProcess._test_send_parent_processc                 C   s   | j dkr| d| j  | jdd\}}| j| j|fd}|  |jtj	ds.t
d| }| |d |  |  |jtj	dsKt
d| }| |d	 d S )
Nrb   r   Fr   r   r&   z(Could not communicate with child processalive	not alive)r   r   r   r   r   _test_create_grandchild_processr   pollr   LONG_TIMEOUTAssertionErrorr   rl   	terminater   )rR   r   r   r   parent_process_statusr   r   r   _test_parent_process1  s"   
z!_TestProcess._test_parent_processc                 C   s(   | j | j|fd}|  td d S )Nr   i,  )r   _test_report_parent_statusr   rU   sleep)r   r   r   r   r   r   r   J  s   z,_TestProcess._test_create_grandchild_processc                 C   sV   ddl m} ||  rdnd | jtjd ||  r&d d S d d S )Nr   r   r   r   r&   )r   r   r   r   r   r   SHORT_TIMEOUTr   r   r   r   r   P  s   "z'_TestProcess._test_report_parent_statusc                 C   s  |  d}|  }|ddf}ddd}d}| j| j|||d}d|_|  }| jd	kr3| |j|j | |	 d
 | |jd | 
||   | t|  tu  | |jd  |  | |jd  | |	 d | ||   | | |dd   | | | | | |j | jd	kr| | |j | | |j |  | |jd | |	 d
 | 
||   t| d S )Nrd         gRQ@)hellobyeSomeProcess)r   rW   kwargsr.   Trb   Fr   )r   Eventr   r   r   r   r   rl   r   r   assertNotInactive_childrenr   typelistr   r   assertIngetr.   r   r   r$   )rR   r~   erW   r   r.   r   r   r   r   r   test_processW  s@   





z_TestProcess.test_processzneeds native_idc                 C   sr   | j dkr| d| j  t j}| d}| j| j|fd}|	  |
 }|  t| | || d S )Nrb   r   rd   r   )r   r   r   	threadingmain_thread	native_idr   r   "_test_process_mainthread_native_idr   r   r   r$   assertNotEqual)rR   current_mainthread_native_idr~   r   child_mainthread_native_idr   r   r   !test_process_mainthread_native_id  s   


z._TestProcess.test_process_mainthread_native_idc                 C   s   t  j}|| d S r   )r   r   r   r}   )r   r~   mainthread_native_idr   r   r   r        
z/_TestProcess._test_process_mainthread_native_idc                 C      t d d S )Nd   rU   r   r   r   r   r   _sleep_some     z_TestProcess._sleep_somec                 C   s   t | d S r   r   )r   delayr   r   r   _test_sleep  r   z_TestProcess._test_sleepc              
      s  | j dkr| d| j  | j| jd d _   |   d | 	 | 
  |  jd  t j}| |dd  | |jd |   d | |dd  | |jd |   d td |  ttd	r fd
d}ttj|}ztd | | d  W td ttj| ntd ttj| w | | d  | |jd |   d |  | 
      jS )Nrb   r   r   Tr   r7   rC   rd   alarmc                     s   t d  )Nzjoin took too long: %sRuntimeErrorrW   r   r   r   handler     z+_TestProcess._kill_process.<locals>.handler
   F)r   r   r   r   r   r   r   rl   r   r   r   r   rN   r   rj   rQ   rU   r   hasattrsignalSIGALRMr   r   )rR   methr   r   old_handlerr   r   r   _kill_process  sB   






z_TestProcess._kill_processc                 C   0   |  tjj}tjdkr| |tj  d S d S Nnt)	r   r   r   r   rD   r.   rl   r   SIGTERMrR   r   r   r   r   test_terminate     
z_TestProcess.test_terminatec                 C   r   r   )	r   r   r   killrD   r.   rl   r   SIGKILLr   r   r   r   	test_kill  r   z_TestProcess.test_killc                 C   sH   zt  }W n ty   d}Y nw | t|tu  | |dk d S rc   )r   	cpu_countrk   r   r   int)rR   cpusr   r   r   test_cpu_count  s   z_TestProcess.test_cpu_countc                 C   sp   |  t|  t | jtjtfd}| ||   d|_	|
  | ||   |  | ||   d S Nr   T)rl   r   r   r   r   rU   r   DELTAr   r   r   r   r   rR   r   r   r   r   test_active_children  s   z!_TestProcess.test_active_childrenc                 C   sV   | | t|dk r'tdD ]}| j| j|||g fd}|  |  qd S d S )Nr   r   )r   r   ranger   _test_recursionr   r   )r   r   idir   r   r   r   r    s   

z_TestProcess._test_recursionT#fails with is_dill(obj, child=True)c                 C   s~   | j dd\}}| |g  tt g }| r$||  | sg dgddgddgdgddgddgg}| || d S )NFr   r   rd   )	r   r  rU   r   r   r   appendr   rl   )rR   r   r   resultexpectedr   r   r   test_recursion  s    
	z_TestProcess.test_recursionc                 C      | d d S )N      $@r5   r   eventr   r   r   _test_sentinel  r   z_TestProcess._test_sentinelc                 C   s   | j dkr| d| j  |  }| j| j|fd}| t |j W d    n1 s.w   Y  |	  | 
|j |j}| |t | t|dd |  |  | t|dd d S )Nrb   r   r   r7   r&   rd   )r   r   r   r   r   r  assertRaisesrG   sentinelr   
addCleanupr   r   r   r   r9   setr   )rR   r  r   r  r   r   r   test_sentinel  s   
z_TestProcess.test_sentinelr   Nc                 C   s   |d ur|   t| d S r   )r   sysexit)r   rcr~   r   r   r   _test_close#  s   z_TestProcess._test_closec                 C   s  | j dkr| d| j  |  }| j| jd|id}d|_|  | |	 d | 
t |  W d    n1 s?w   Y  |d  |  | |	 d | |jd |  | 
t |	  W d    n1 stw   Y  | 
t |  W d    n1 sw   Y  | 
t |  W d    n1 sw   Y  |  t|}~t  | | d  t| d S )Nrb   r   r~   )r   r   TFr   )r   r   r   r   r   r  r   r   rl   r   r  rG   r    r}   r   r   r   weakrefrefgccollectassertIsr$   )rR   r~   r   wrr   r   r   
test_close)  s<   






z_TestProcess.test_closec                    s<   j dkr d j  t }tjd}|dkr"|r dndnd} fdd	t|D }|D ]}|	  q1|D ]}t
| q:|D ]	} |jd
 qC fdd	t|D }|D ]}|	  qZtd |D ]}|  qh|D ]}t
| qqtjdkrtj g}tjdkr|tj  |D ]} |j| qd S d S )Nrb   r   r   spawnrd   r|   r   c                    s   g | ]
} j  jd dqS )){Gz?r   )r   r   .0r  rx   r   r   
<listcomp>R  s    z4_TestProcess.test_many_processes.<locals>.<listcomp>r   c                    s   g | ]	} j  jd qS )r   )r   r   r!  rx   r   r   r#  [  s    MbP?r   darwin)r   r   r   r   get_start_methodrD   environr   r  r   r*   rl   r   rU   r   r   r.   r   r   r  platformr  r   r   )rR   smtravisNprocsr   	exitcodesr   rx   r   test_many_processesI  s@   











z _TestProcess.test_many_processesc                 C   sn   t  }t|}|  }| j|||fd}~|  |  t  | 	| d  | 
| d t| d S )Nr   r|   )rz   r  r  r   r   r   r   r  r  r  rl   r   r$   )rR   r   r  r~   r   r   r   r   test_lose_target_refm  s   
z!_TestProcess.test_lose_target_refc                 C   s   | t  |  d S r   )r}   r   fd_countr6   )rR   evtr~   r   r   r   _test_child_fd_inflationz     z%_TestProcess._test_child_fd_inflationc              	      s   j dkrdj  t }|dkrd| d}    fddt|D }|D ]}|  q7z*fddt|D }	t
t|d| W    |D ]}|  q\t d S    |D ]}|  qot w )	Nrb   r   forkr|   c                    s    g | ]}j j fd qS r   )r   r2  r!  r1  r~   rR   r   r   r#    s    z8_TestProcess.test_child_fd_inflation.<locals>.<listcomp>c                       g | ]}   qS r   r   r!  r~   r   r   r#        rd   )r   r   r   r   r&  r   r   r  r   rl   r   r  r   r$   )rR   r)  r+  r,  r   	fd_countsr   r6  r   test_child_fd_inflation  s0   




z$_TestProcess.test_child_fd_inflationc                    s>    fdd} fdd}t j|d  t j|dd  d S )Nc                         t d    d S )N      ?rU   r   r  r   r1  r   r   func1     
z2_TestProcess._test_wait_for_threads.<locals>.func1c                      r=  )N   )rU   r   clearr   r@  r   r   func2  rB  z2_TestProcess._test_wait_for_threads.<locals>.func2r   Tr   )r   Threadr   )rR   r1  rA  rE  r   r@  r   _test_wait_for_threads  s   z#_TestProcess._test_wait_for_threadsc                 C   sX   | j dkr| d| j  |  }| j| j|fd}|  |  | |	  d S )Nrb   r   r   )
r   r   r   r   r   rG  r   r   r   is_set)rR   r1  procr   r   r   test_wait_for_threads  s   
z"_TestProcess.test_wait_for_threadsc                 C   sT   |  D ]\}}|dkrt }|  n|dksJ d }tt|d  q|  d S )Nr    remove)itemsioStringIOr    setattrr  r  )rR   r1  break_std_streamsstream_nameactionstreamr   r   r   _test_error_on_stdio_flush  s   
z'_TestProcess._test_error_on_stdio_flushc                 C   s   t  d g}|d   dD ]D}|D ]?}tt|}tt|| z+|  }| j| j|fd}|	  |
  | |  | |jd W tt|| qtt|| w qd S )Nr   stdoutstderrr   )rM  rN  r    getattrr  rO  r   r   rT  r   r   r   rH  rl   r   )rR   streamsrQ  rS  
old_streamr1  rI  r   r   r   test_error_on_stdio_flush_1  s$   
z(_TestProcess.test_error_on_stdio_flush_1c                 C   s   dD ]A}dD ]<}t t|}z.|  }| j| j|||ifd}|  |  | |  | 	|j
d W tt|| qtt|| w qd S )NrU  )r    rK  r   r   )rX  r  r   r   rT  r   r   r   rH  rl   r   rO  )rR   rQ  rR  rZ  r1  rI  r   r   r   test_error_on_stdio_flush_2  s   

z(_TestProcess.test_error_on_stdio_flush_2r7   c                 C   s   t | |  d S r   r?  )rR   r1  r   r   r   r   _sleep_and_set_event     
z!_TestProcess._sleep_and_set_eventc           
      C   s  | j dkr| d| j  t }|dkr| d| ddlm} |  d}|  }| j	| j
||fd}|  |j}t|| t|d  |  }| j	| j
|fd}	|	  |	  | |  | |	jd |  | |  | |jd	 d S )
Nrb   r   
forkserverr   )_forkserverr>  r          @)r      )r   r   r   r   r&  multiprocess.forkserverr`  ensure_runningr   r   r]  r   _forkserver_pidrD   r   rU   r   r   r   rH  rl   r   r   )
rR   signumr)  r`  r   r1  rI  r   evt2r   r   r   r   check_forkserver_death  s.   
z#_TestProcess.check_forkserver_deathc                 C   s   |  tj d S r   )rh  r   SIGINTrx   r   r   r   test_forkserver_sigint     z#_TestProcess.test_forkserver_sigintc                 C   s   t jdkr| tj d S d S r   )rD   r.   rh  r   r   rx   r   r   r   test_forkserver_sigkill  s   
z$_TestProcess.test_forkserver_sigkill)r   Nr7   )/r\   r]   r^   rs   r   r   classmethodr   r   r   r   r   r   r   rH   
skipUnlessr   _HAVE_THREAD_NATIVE_IDr   r   r   r   r   r   r   r   r   r  skipIfr	  r  r  r  r  r.  r/  r2  r<  rG  rJ  rT  r[  r\  r]  rh  rj  rl  r   r   r   r   r      sn    
	


(



3




 $

&r   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_UpperCaserc                 C   s    t j|  t  \| _| _d S r   )r   r   rS   r   
child_connparent_connrx   r   r   r   rS   "  s   z_UpperCaser.__init__c                 C   s<   | j   t| jjd D ]
}| j|  q| j  d S r   )ru  r    iterrt  r   r   upperrR   r   r   r   r   run&  s   
z_UpperCaser.runc                 C   s&   t |tu sJ | j| | j S r   )r   strru  r   r   rx  r   r   r   submit,  s   
z_UpperCaser.submitc                 C   s$   | j d  | j   | j  d S r   )ru  r   r    rt  rx   r   r   r   stop1  s   
z_UpperCaser.stopN)r\   r]   r^   rS   ry  r{  r|  r   r   r   r   rs     s
    rs  c                   @   s@   e Zd ZdZdd Zdd Zedd Zedd	 Zd
d Z	dS )_TestSubclassingProcessr`   c                 C   sL   t  }d|_|  | |dd | |dd |  |  d S )NTr   HELLOworldWORLD)rs  r   r   rl   r{  r|  r   )rR   
uppercaserr   r   r   test_subclassing:  s   z(_TestSubclassingProcess.test_subclassingc                 C   s   | j dkr| d| j  tj}| tj| | j| j|fd}|	  |
  t|dd}| }| d| | d| W d    d S 1 sKw   Y  d S )Nrb   r   r   utf-8encodingZeroDivisionErrorz__init__.py)r   r   r   r   TESTFNr  unlinkr   _test_stderr_flushr   r   openreadr   )rR   testfnrI  ferrr   r   r   test_stderr_flushC  s   
"z)_TestSubclassingProcess.test_stderr_flushc                 C   s8   t |t jt jB t jB }t|ddddt_dd  d S )Nwr  Fr  closefdrd   r   )rD   r  O_WRONLYO_CREATO_EXCLr  rW  )r   r  fdr   r   r   r  T  s   z*_TestSubclassingProcess._test_stderr_flushc                 C   s:   t |t jt jB t jB }t|ddddt_t| d S )Nr  r  Fr  )rD   r  r  r  r  r  rW  r  )r   reasonr  r  r   r   r   _test_sys_exit[  s   z&_TestSubclassingProcess._test_sys_exitc           	   	   C   sF  | j dkr| d| j  tj}| tj| g ddfD ]G}| j| j||fd}d|_	|
  t| | |jd t|dd	}| }W d    n1 sQw   Y  | | t| t| qg d
}|D ]4\}}| j|d" | jtj|d}d|_	|
  t| | |j| W d    n1 sw   Y  qld S )Nrb   r   )rd   r      zignore thisr   Trd   r  r  )))Trd   )Fr   ))   r  )r   r   )r   r   r   )r   r   r   r   r  r  r  r   r  r   r   r*   rl   r   r  r  rstriprz  rD   subTestr  r  )	rR   r  r  r   r  contentcasesrW   r  r   r   r   test_sys_exita  s8   

z%_TestSubclassingProcess.test_sys_exitN)
r\   r]   r^   rs   r  r  rn  r  r  r  r   r   r   r   r}  6  s    	

r}  c                 C   s   t | dr	|  S |  dkS )Nemptyr   )r   r  qsizer9  r   r   r   queue_empty     
r  c                 C   s   t | dr	|  S |  |kS )Nfull)r   r  r  )r~   maxsizer   r   r   
queue_full  r  r  c                   @   s   e Zd Zedd Zdd Zedd Zdd Zed	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dd ZdS )
_TestQueuec                 C   s*   |   tdD ]}|  q|  d S )N   )r6   r  r   r  )r   r#   child_can_startparent_can_continuer  r   r   r   	_test_put  s   
z_TestQueue._test_putc                 C   s  d}| j |d}|  }|  }| j| j|||fd}d|_|  | t|d | t||d |	d |	dd |	ddd  |	d	d |	d
dd  |
d tt | t|d | t||d t|j	}t|j
}| tj|dd | |jd | tj|ddd  | |jd | tj|d | |jd | tj|ddt | |jt | tj|ddt | |jd | jtj|ddtd | |jt |  |  | t|d | t||d |  t| d S )Nr  r  r   TFrd   r   r     r|      r   r&   )r   r   r   r  r   r   rl   r  r  r}   
put_nowaitrU   r   r   rN   r  pyqueueFullrj   rQ   TIMEOUT1TIMEOUT2TIMEOUT3r  r6   r   r$   )rR   MAXSIZEr#   r  r  rI  r}   r  r   r   r   test_put  sR   




z_TestQueue.test_putc                 C   s<   |   |d |d |d |d |  d S )Nr   r  r  r|   )r6   r}   r  r   r#   r  r  r   r   r   	_test_get  s   



z_TestQueue._test_getc                 C   s  |   }|  }|  }| j| j|||fd}d|_|  | t|d |  |	  t
t | t|d | |dd d | |dd | |jddd | | d	 | t|d t|j}t|j}| tj|d | |jd
 | tj|dd  | |jd
 | tj| | |jd
 | tj|dt | |jt | tj|dt | |jd
 | jtj|td | |jt |  t| d S )Nr   TFr   r  rd   r&   r  r|   r   )r   r   r   r  r   r   rl   r  r  r6   rU   r   r   r   
get_nowaitrN   r  r  Emptyrj   rQ   r  r  r  r   r$   )rR   r#   r  r  rI  r   r  r   r   r   test_get  sF   


z_TestQueue.test_getc                 C   s   t ddD ]}|| qd S )Nr   rC  )r  r}   )r   r#   r  r   r   r   
_test_fork  s   z_TestQueue._test_forkc                 C   s   |   }tdD ]}|| qtt | j| j|fd}d|_|	  tdD ]
}| 
| | q)| tj|jd |  t| d S )Nr   r   TrC  F)r   r  r}   rU   r   r   r   r  r   r   rl   r   r  r  r  r   r$   )rR   r#   r  r   r   r   r   	test_fork&  s   
z_TestQueue.test_forkc                 C   s   |   }z
| | d W n ty   | d Y nw |d | | d |d | | d |  | | d |  | | d t| d S )Nr   zqsize method not implementedrd   r|   r   )r   rl   r  rk   r   r}   r   r$   rR   r~   r   r   r   
test_qsizeB  s   

z_TestQueue.test_qsizec                 C   s(   t |jd D ]}tt |  qd S r   )rv  r   rU   r   r   	task_done)r   r~   objr   r   r   _test_task_doneR  s   

z_TestQueue._test_task_donec                    s       fddtdD }|D ]	}d|_|  qtdD ]} | q    |D ]} d  q.|D ]}|  q8t  d S )Nc                    s   g | ]}j j fd qS r5  )r   r  r!  r#   rR   r   r   r#  [  s    z-_TestQueue.test_task_done.<locals>.<listcomp>r  Tr   )JoinableQueuer  r   r   r}   r   r$   )rR   workersr   r  r   r  r   test_task_doneX  s   

z_TestQueue.test_task_donec              
   C   s   t  ^ d}t|d ddd}|d W d    n1 s w   Y  tt  zt| W n t	j
yB   | d Y nw W d    n1 sMw   Y  W d    d S W d    d S 1 sew   Y  d S )Nimported_by_an_imported_modulez.pyr  r  r  a  if 1:
                    import multiprocess as multiprocessing

                    q = multiprocessing.Queue()
                    q.put('knock knock')
                    q.get(timeout=3)
                    q.close()
                    del q
                z?Probable regression on import lock contention; see Issue #22853)r   temp_cwdr  writer   DirsOnSysPathrD   getcwd
__import__r  r  fail)rR   module_namer  r   r   r   test_no_import_lock_contentionn  s    
"z)_TestQueue.test_no_import_lock_contentionc                 C   sH   t  }t }| tj|jdd t | }| |d t	| d S )NTg?r2   )
r   r   rU   rV   r  r  r  r   assertGreaterEqualr$   )rR   r~   r   deltar   r   r   test_timeout  s   z_TestQueue.test_timeoutc              	   C   s4  | j dkr| d| j  G dd dt}tj % |  }||  |d | 	|j
tjd t| W d    n1 sCw   Y  tj C | jdd}||  |d z
| | d W n	 tyr   Y nw | 	|j
tjd | 	|  t| W d    d S 1 sw   Y  d S )	Nr`   r   c                   @   ry   )zF_TestQueue.test_queue_feeder_donot_stop_onexc.<locals>.NotSerializablec                 S      t r   )rF   rx   r   r   r   rq        zQ_TestQueue.test_queue_feeder_donot_stop_onexc.<locals>.NotSerializable.__reduce__Nr\   r]   r^   rq   r   r   r   r   NotSerializable  r   r  Tr&   rd   r  )r   r   r   objecttestr   captured_stderrr   r}   r   r   r   r$   rl   r  rk   r  )rR   r  r~   r   r   r   "test_queue_feeder_donot_stop_onexc  s.   




"z-_TestQueue.test_queue_feeder_donot_stop_onexcc                    s   | j dkr| d| j  G dd dt G  fdddtjj}  }tj	 # |t
 d}|| |d | |jtjd	 W d    n1 sPw   Y  | |j | |j d S )
Nr`   r   c                   @       e Zd ZdZdd Zdd ZdS )zK_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.NotSerializablezMock unserializable objectc                 S   s   d| _ d| _d S NF)reduce_was_called on_queue_feeder_error_was_calledrx   r   r   r   rS     rT   zT_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.NotSerializable.__init__c                 S   s
   d| _ tNT)r  rF   rx   r   r   r   rq     s   zV_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.NotSerializable.__reduce__N)r\   r]   r^   __doc__rS   rq   r   r   r   r   r    s    r  c                       s    e Zd ZdZe fddZdS )zE_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.SafeQueuez1Queue with overloaded _on_queue_feeder_error hookc                    s&   t | trt | rd|_d S d S d S r  )r   rF   r  )r   r  r  r   r   _on_queue_feeder_error  s
   

z\_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.SafeQueue._on_queue_feeder_errorN)r\   r]   r^   r  staticmethodr  r   r  r   r   	SafeQueue  s    r  )ctxTr&   )r   r   r   r  r   r   r   r  r   r  get_contextr}   r   r   r   r  r  )rR   r  not_serializable_objr~   r   r  r   'test_queue_feeder_on_queue_feeder_error  s   



	z2_TestQueue.test_queue_feeder_on_queue_feeder_errorc              	   C   s   t  t  fD ];}|  | td |d W d    n1 s$w   Y  | td |  W d    n1 s>w   Y  qd S )Nz	is closedfoo)r   r   r  r    assertRaisesRegexrG   r}   r   r  r   r   r   $test_closed_queue_put_get_exceptions  s   
z/_TestQueue.test_closed_queue_put_get_exceptionsN)r\   r]   r^   rn  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r    s&    
;
	5

 &r  c                   @   $   e Zd Zdd Zdd Zdd ZdS )	_TestLockc                 C   sR   |   }| | d | |dd | | d  | ttjf|j d S )NTF)Lockrl   acquirereleaser  rG   r   ThreadErrorrR   lockr   r   r   	test_lock  s
   z_TestLock.test_lockc                 C   s~   |   }| | d | | d | | d | | d  | | d  | | d  | ttf|j d S r  )RLockrl   r  r  r  r   r   r  r   r   r   
test_rlock  s   z_TestLock.test_rlockc                 C   s.   |   	 W d    d S 1 sw   Y  d S r   r  rx   r   r   r   test_lock_context  s   
"z_TestLock.test_lock_contextN)r\   r]   r^   r  r  r  r   r   r   r   r    s    
r  c                   @   rr  )
_TestSemaphorec                 C   s   |  dt| | | d |  dt| | | d |  dt| | |dd |  dt| | | d  |  dt| | | d  |  dt| d S )Nr   Trd   r   F)ro   ru   rl   r  r  rR   semr   r   r   _test_semaphore  s   z_TestSemaphore._test_semaphorec                 C   sT   |  d}| | | | d  | dt| | | d  | dt| d S )Nr   r  r  )	Semaphorer  rl   r  ro   ru   r  r   r   r   test_semaphore  s   

z_TestSemaphore.test_semaphorec                 C   s   |  d}| | d S Nr   )BoundedSemaphorer  r  r   r   r   test_bounded_semaphore     
z%_TestSemaphore.test_bounded_semaphorec                 C   s   | j dkr| d| j  | d}t|j}| |dd | |jd | |dd d | |jd | |dt	d | |jd | |dt
d | |jt
 | |tdd | |jt d S )Nr`   r   r   Fr7   Tr&   )r   r   r   r  rN   r  rl   rj   rQ   r  r  r  )rR   r  r  r   r   r   r    s   


z_TestSemaphore.test_timeoutN)r\   r]   r^   r  r   r  r  r   r   r   r   r    s
    r  c                   @   s   e Zd ZedddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
edd Zeeddd Zedd Zeeddd Zedd Zdd ZdS )_TestConditionNc                 C   s.   |   |  || |  |  d S r   )r  r  r6   )r   condsleepingwokenr'   r   r   r   r  /  s
   
z_TestCondition.fc              	   C   s\   t dD ]}z
| |krW  nW n
 ty   Y  nw tt qtt | || d S Nr   )r  rk   rU   r   r   ro   )rR   rP   rm   r  r   r   r   assertReachesEventually7  s   

z&_TestCondition.assertReachesEventuallyc                 C   s\   | j dkr,z|j |j  }| |d | |j d W d S  ty+   Y d S w d S )Nr`   r   )r   _sleeping_countru   _woken_countrl   _wait_semaphorerk   )rR   r  sleepersr   r   r   check_invariantB  s   
z_TestCondition.check_invariantc                 C   s  |   }| d}| d}| j| j|||fd}d|_|  | |j tj	| j|||fd}d|_|  | |j |
  |
  tt | dt| |
  |  |  tt | dt| |
  |  |  tt | dt| | | |  d S )Nr   r   Trd   r   )	Conditionr  r   r  r   r   r  r   r   rF  r  rU   r   r   ro   ru   notifyr  r  )rR   r  r  r  r   r   r   r   test_notifyM  s6   





z_TestCondition.test_notifyc                    s  |   }| d}| d tdD ]4}| j| j|| tfd}d|_|  | |j	 t
j| j|| tfd}d|_|  | |j	 qtdD ]}|  qKtdD ]}   qV| dt  | | tdD ]2}| j| j|| fd}d|_|  | |j	 t
j| j|| fd}d|_|  | |j	 qmtdD ]}|  qtt | dt  |  |  |  |  fddd | | d S )Nr   r  r   Tr  c                         t  S r   ru   r   r  r   r   <lambda>      z0_TestCondition.test_notify_all.<locals>.<lambda>)r  r  r  r   r  r  r   r   r  r   r   rF  r  ro   ru   r  rU   r   r   
notify_allr  r
  rR   r  r  r  r   rY   r   r  r   test_notify_allz  sP   








z_TestCondition.test_notify_allc                    sP  |   }| d}| d tdD ]2}| j| j|| fd}d|_|  | |j t	j
| j|| fd}d|_|  | |j qtdD ]}|  qItt | dt  |  |jdd |  |  fdd	d |  |jd
d |  |  fdd	d |  |jdd |  | dt  | | d S )Nr   r  r   Tr  r   )nc                      r  r   r  r   r  r   r   r    r  z._TestCondition.test_notify_n.<locals>.<lambda>r  c                      r  r   r  r   r  r   r   r    r  )r  r  r  r   r  r   r   r  r   r   rF  r  rU   r   r   ro   ru   r  r  r
  r  r  r   r  r   test_notify_n  s:   



z_TestCondition.test_notify_nc                 C   sH   |   }t|j}|  |t}|  | |d | |jt d S r  )	r  rN   r6   r  r  r  rl   rj   rQ   )rR   r  r6   rn   r   r   r   r    s   
z_TestCondition.test_timeoutc                    sr   |- d _ |  | fdd}|r j dkr'td W d    d S W d    d S 1 s2w   Y  d S )Nr   c                      
    j dkS Nr  rm   r   stater   r   r       
 z0_TestCondition._test_waitfor_f.<locals>.<lambda>r  rd   )rm   r  wait_forr  r  )r   r  r!  r  r   r   r   _test_waitfor_f  s   "z_TestCondition._test_waitfor_fzneeds sharedctypesc              	      s   |   }| dd | j| j| fd}d|_|  | | fdd}| | |  j	d W d    n1 s=w   Y  t
dD ]$}td	 |   j	d
7  _	|  W d    n1 sew   Y  qFt| | |jd d S )Nr  rC   r   Tc                      r  Nr   r  r   r   r   r   r    r"  z-_TestCondition.test_waitfor.<locals>.<lambda>r   r  r   rd   )r  r   r   r$  r   r   r#  r   rl   rm   r  rU   r   r  r*   r   )rR   r  r   r  r  r   r   r   test_waitfor  s&   


z_TestCondition.test_waitforc                    s   |   |M d}t }|j fdd|d}t | }|s;|d |  k r.|d k rKn nd|_W d    d S W d    d S W d    d S W d    d S 1 sVw   Y  d S )Nr2   c                      r  r  r  r   r   r   r   r    r"  z8_TestCondition._test_waitfor_timeout_f.<locals>.<lambda>r&   g333333?r  T)r  rU   rV   r#  rm   )r   r  r!  successr  r  dtr  r   r   r   _test_waitfor_timeout_f  s   $"z&_TestCondition._test_waitfor_timeout_fc              	   C   s   |   }| dd}| dd}| d}| j| j||||fd}d|_|  | |jt	j
d tdD ]$}td | | jd	7  _|  W d    n1 sUw   Y  q6t| | |j d S )
Nr  r   Fr   Tr&   r  r   rd   )r  r   r  r   r)  r   r   r   r  r   r   r  rU   r   rm   r  r*   )rR   r  r!  r'  r  r   r  r   r   r   test_waitfor_timeout   s&   



z#_TestCondition.test_waitfor_timeoutc                 C   sT   | |   W d    n1 sw   Y  td |d ur(t|tj d S d S rc   )r  rU   r   rD   r   r   ri  )r   r   r   r   r   r   _test_wait_result8  s   

z _TestCondition._test_wait_resultc                 C   s   t | trtjdkrt }nd }|  }|? | |d | |d | j	| j
||fd}|  | |d |d urJ| t|jd |  W d    d S 1 sYw   Y  d S )Nr4   r   r2   r   <   )r   ProcessesMixinr  r(  rD   r   r  r   r6   r   r+  r   r   r  KeyboardInterruptr   )rR   r   r   r   r   r   r   test_wait_result@  s   

"z_TestCondition.test_wait_resultr   )r\   r]   r^   rn  r  r
  r  r  r  r  r  r$  rH   ro  HAS_SHAREDCTYPESr&  r)  r*  r+  r/  r   r   r   r   r  -  s(    ->2	






r  c                   @       e Zd Zedd Zdd ZdS )
_TestEventc                 C   s   t t |  d S r   )rU   r   r  r  r  r   r   r   _test_eventW  r^  z_TestEvent._test_eventc                 C   s   |   }t|j}| | d | |dd | |jd | |td | |jt |  | | d | | d | |jd | |td | |jd |	  | j
| j|fd}d|_|  | | d |  d S )NFr7   Tr   )r   rN   r6   rl   rH  rj   rQ   r  r  rD  r   r3  r   r   r   )rR   r  r6   r   r   r   r   
test_event\  s&   
z_TestEvent.test_eventN)r\   r]   r^   rn  r3  r4  r   r   r   r   r2  U  s    
r2  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )
_DummyListc                 C   s6   t jtd}t  }| ||f d| jd< d S )Nr  r   )r   heapBufferWrapperstructcalcsizer  __setstate__
_lengthbuf)rR   wrapperr  r   r   r   rS     s   z_DummyList.__init__c                 C   s"   |\| _ | _| j  d| _d S )Nr  )_wrapper_lockcreate_memoryviewcastr;  )rR   r!  r   r   r   r:    s   z_DummyList.__setstate__c                 C   s   | j | jfS r   )r=  r>  rx   r   r   r   __getstate__  r   z_DummyList.__getstate__c                 C   s>   | j  | jd  d7  < W d    d S 1 sw   Y  d S Nr   rd   r>  r;  )rR   _r   r   r   r    s   "z_DummyList.appendc                 C   s4   | j  | jd W  d    S 1 sw   Y  d S r%  rC  rx   r   r   r   __len__  s   $z_DummyList.__len__N)r\   r]   r^   rS   r:  rA  r  rE  r   r   r   r   r5    s    r5  c                   C   r   )Nr   r   r   r   r   r   _wait  r   rF  c                   @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )Bunchz
    A bunch of threads.
    Fc           
      C   s   || _ || _|| _| | _| | _| | _|s| j  g }t	|D ]}|j
| jd}d|_|  || q%dd }	t| |	|| _dS )z
        Construct a bunch of `n` threads running the same function `f`.
        If `wait_before_exit` is True, the threads won't terminate until
        do_finish() is called.
        r   Tc                 S   s   | D ]}|   qd S r   )r   )rb   r   r   r   r   finalize  s   
z Bunch.__init__.<locals>.finalizeN)r  rW   r  	DummyListstartedfinishedr   	_can_exitr  r  r   taskr   r   r  r  rH  
_finalizer)
rR   	namespacer  rW   r  wait_before_exitrb   r  r   rH  r   r   r   rS     s    



zBunch.__init__c              	   C   sv   t  }| j| z| j| j  W | j| | jd | j	 s%J d S | j| | jd | j	 s:J w )N   )
rD   r   rJ  r  r  rW   rK  rL  r6   rH  rR   r   r   r   r   rM    s   z
Bunch.taskc                 C   .   t | j| jk rt  t | j| jk sd S d S r   )r   rJ  r  rF  rx   r   r   r   wait_for_started     zBunch.wait_for_startedc                 C   rS  r   )r   rK  r  rF  rx   r   r   r   wait_for_finished  rU  zBunch.wait_for_finishedc                 C   s   | j   d S r   )rL  r  rx   r   r   r   	do_finish     zBunch.do_finishc                 C   s   |    d S r   )rN  rx   r   r   r   r      r   zBunch.closeNr  )
r\   r]   r^   r  rS   rM  rT  rV  rW  r    r   r   r   r   rG    s    

rG  c                   @   rM   )
AppendTruec                 C   s
   || _ d S r   )r  )rR   r  r   r   r   rS     r   zAppendTrue.__init__c                 C   s   | j d d S r  )r  r  rx   r   r   r   rZ        zAppendTrue.__call__Nr[   r   r   r   r   rY        rY  c                   @   s   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	e
dd Zd6ddZdd Ze
dd Zdd Ze
dd Zdd Ze
dd Zdd Ze
dd  Zd!d" Ze
d#d$ Zd%d& Ze
d'd( Zd)d* Ze
d+d, Zd-d. Zd/d0 Ze
d1d2 Zd3d4 Zd5S )7_TestBarrierz$
    Tests for Barrier objects.
    r|   g      >@c                 C   s   | j | j| jd| _d S r%   )Barrierr+  defaultTimeoutbarrierrx   r   r   r   setUp  s   z_TestBarrier.setUpc                 C   s   | j   d | _ d S r   )r_  abortrx   r   r   r   tearDown  s   

z_TestBarrier.tearDownc                 C   s(   | j dkrg S | j dkr| j S t S )Nrb   ra   )r   ra   r   r5  rx   r   r   r   rI    s
   


z_TestBarrier.DummyListc                 C   s>   t | ||| jd }z||  |  W |  d S |  w rc   )rG  r+  rV  r    )rR   r  rW   ri   r   r   r   run_threads  s
   
z_TestBarrier.run_threadsc                 C   s   |j }|| jks
J t|D ]2}|d d t|d || ks#J |  |d d t|d |d | ks<J |  qz	|jdksIJ W n	 tyS   Y nw |jrYJ d S )Nr   Trd   )	partiesr+  r  r  r   r6   	n_waitingrk   broken)r   r_  resultsr  mr  r   r   r   	multipass  s   
z_TestBarrier.multipassrd   c                 C   s*   |   |   g}| | j| j||f dS )z;
        Test that a barrier is passed in lockstep
        N)rI  rc  ri  r_  )rR   passesrg  r   r   r   test_barrier  s   z_TestBarrier.test_barrierc                 C   r   )zC
        Test that a barrier works for 10 consecutive runs
        r   )rk  rx   r   r   r   test_barrier_10  s   
z_TestBarrier.test_barrier_10c                 C   s   |  }|| d S r   )r6   r}   )r   r_  r#   rn   r   r   r   _test_wait_return_f      z _TestBarrier._test_wait_return_fc                    sR   |    | | j| j f  fddt| jD }| |dd t  dS )z9
        test the return value from barrier.wait
        c                    r7  r   r8  r!  r"   r   r   r#  +  r:  z1_TestBarrier.test_wait_return.<locals>.<listcomp>r   rd   N)	r   rc  rm  r_  r  r+  rl   countr$   rR   rg  r   r"   r   test_wait_return%  s
   z_TestBarrier.test_wait_returnc                 C   s   |   t|dkrtd S rc   )r6   r   r   )r   r_  rg  r   r   r   _test_action_f/  s   z_TestBarrier._test_action_fc                 C   sB   |   }| j| jt|d}| | j||f | t|d dS )z,
        Test the 'action' callback
        )rR  rd   N)rI  r]  r+  rY  rc  rr  rl   r   )rR   rg  r_  r   r   r   test_action5  s   z_TestBarrier.test_actionc                 C   sn   z|  }|| jd krt|   |d W d S  tjy)   |d Y d S  ty6   |  Y d S w Nr   T)r6   r+  r   r  r   BrokenBarrierErrorra  )r   r_  results1results2r  r   r   r   _test_abort_f>  s   z_TestBarrier._test_abort_fc                 C   s^   |   }|   }| | j| j||f | t|d | t|| jd  | | jj dS )zK
        Test that an abort will put the barrier in a broken state
        r   rd   N)	rI  rc  rx  r_  rl   r   r+  r   rf  )rR   rv  rw  r   r   r   
test_abortK  s   
z_TestBarrier.test_abortc                 C   s   |  }|| jd kr%|j| jd k r td |j| jd k s|  nz|   |d W n tjy?   |d Y nw |   |d d S )Nr   rd   r$  T)	r6   r+  re  rU   r   resetr  r   ru  )r   r_  rv  rw  results3r  r   r   r   _test_reset_fW  s   

z_TestBarrier._test_reset_fc                 C   sl   |   }|   }|   }| | j| j|||f | t|d | t|| jd  | t|| j dS )zL
        Test that a 'reset' on a barrier frees the waiting threads
        r   rd   N)rI  rc  r|  r_  rl   r   r+  )rR   rv  rw  r{  r   r   r   
test_reseti  s   z_TestBarrier.test_resetc                 C   s   z|  }|| jd krt|   |d W n tjy'   |d Y n ty3   |  Y nw |  | jd krA|  |   |   |d d S rt  )r6   r+  r   r  r   ru  ra  rz  )r   r_  barrier2rv  rw  r{  r  r   r   r   _test_abort_and_reset_fv  s    z$_TestBarrier._test_abort_and_reset_fc                 C   sz   |   }|   }|   }| | j}| | j| j||||f | t|d | t|| jd  | t|| j dS )zF
        Test that a barrier can be reset after being broken.
        r   rd   N)rI  r]  r+  rc  r  r_  rl   r   )rR   rv  rw  r{  r~  r   r   r   test_abort_and_reset  s   z!_TestBarrier.test_abort_and_resetc                 C   sR   |  }|| jd krtd z| d W d S  tjy(   |d Y d S w )Nr         ?r>  T)r6   r+  rU   r   r   ru  r  r   r_  rg  r  r   r   r   _test_timeout_f  s   
z_TestBarrier._test_timeout_fc                 C   s4   |   }| | j| j|f | t|| jj dS )z$
        Test wait(timeout)
        N)rI  rc  r  r_  rl   r   rd  rp  r   r   r   r    s   z_TestBarrier.test_timeoutc                 C   sT   | | j}|| jd krtd z|   W d S  tjy)   |d Y d S w )Nr   r  T)r6   r^  r+  rU   r   r   ru  r  r  r   r   r   _test_default_timeout_f  s   
z$_TestBarrier._test_default_timeout_fc                 C   s@   | j | jdd}|  }| | j||f | t||j dS )z4
        Test the barrier's default timeout
        r>  r&   N)r]  r+  rI  rc  r  rl   r   rd  )rR   r_  rg  r   r   r   test_default_timeout  s   z!_TestBarrier.test_default_timeoutc                 C   s   |  d}|  |  d S rc   )r]  r6   )rR   ri   r   r   r   test_single_thread  s   
z_TestBarrier.test_single_threadc              	   C   sH   t |D ]}|  | || W d    n1 sw   Y  qd S r   )r  r6   r   )r   r_  rj  connr  r  r   r   r   _test_thousand_f  s   z_TestBarrier._test_thousand_fc                 C   s   | j dkr| d| j  d}|  }| d\}}t| jD ]}| j| j| j	|||fd}|
  | |j q t|D ]}t| jD ]
}| | | qEq>d S )Nra   r     Fr   )r   r   r   r  r   r  r+  r   r  r_  r   r  r   rl   r   )rR   rj  r  r  rt  jr   r  r   r   r   test_thousand  s    
z_TestBarrier.test_thousandN)rd   )r\   r]   r^   r  r+  r^  r`  rb  rI  rc  rn  ri  rk  rl  rm  rq  rr  rs  rx  ry  r|  r}  r  r  r  r  r  r  r  r  r  r   r   r   r   r\    sJ    




	






	
r\  c                   @   sZ   e Zd ZdZdddddededfgZd	d
 Zedd ZdddZ	dd Z
dd ZdS )
_TestValuer~  )r  i  i^  )dg      @g      )hi   )r~                   r   xyc                 C      t s	| d d S d S Nz"requires multiprocess.sharedctypesr0  r   rx   r   r   r   r`       z_TestValue.setUpc                 C   s$   t || jD ]	\}}|d |_qd S r  )zipcodes_valuesrm   )r   valuessvcvr   r   r   r     s   z_TestValue._testFc                    s   |r fdd j D }n
 fdd j D }t| j D ]\}} |j|d  q j j|fd}d|_|  |  t| j D ]\}} |j|d  qEd S )Nc                       g | ]\}}}  ||qS r   )RawValuer"  coderm   rD  rx   r   r   r#        z)_TestValue.test_value.<locals>.<listcomp>c                    r  r   )r   r  rx   r   r   r#    r  rd   r   Tr   )	r  r  rl   rm   r   r   r   r   r   )rR   rawr  r  r  rI  r   rx   r   
test_value  s    

z_TestValue.test_valuec                 C      | j dd d S NT)r  )r  rx   r   r   r   test_rawvalue  rZ  z_TestValue.test_rawvaluec                 C   s   |  dd}| }| }| j ddd d}| }| }|  }| j dd|d}| }	| }
| ||	 | j dddd}| t|d | t|d | jt| j dddd | 	dd}| t|d | t|d d S )Nr  r|   r  Fget_lockget_objnavalue)
r   r  r  r  rl   r   r   r  rF   r  )rR   val1lock1obj1val2lock2obj2r  val3lock3obj3arr4arr5r   r   r   test_getobj_getlock  s$   z_TestValue.test_getobj_getlockNr  )r\   r]   r^   rs   r   r  r`  rn  r   r  r  r  r   r   r   r   r    s    

r  c                   @   s~   e Zd ZdZedd Zeedu ddddZ	eedu dd	d
 Z
eedu ddd Zeedu ddd ZdS )
_TestArrayr~  c                 C   s0   t dt|D ]}||  ||d  7  < qd S rc   )r  r   )r   seqr  r   r   r   r  ,  s   z_TestArray.fNzrequires _ctypesFc                 C   s   g d}|r|  d|}n| d|}| t|t| | |d |d  | t|dd t|dd  tdg d |dd< |dd< | t|d d  | | | | j| j|fd	}d
|_|	  |
  | t|d d  | d S )N)
i  ir  i  i5        i$  i  i  i?  r  r  r   r  )rd   r   r  r  r  r  r   T)RawArrayArrayrl   r   r   arrayr  r   r   r   r   )rR   r  r  arrr   r   r   r   
test_array1  s   $$
z_TestArray.test_arrayc                 C   sr   d}t dD ]0}| d|}| t|| | t|dg|  t d|d d < | t|tt d ~qd S )Nr   r  r  r   )r  r  rl   r   r   )rR   sizerD  r  r   r   r   test_array_from_sizeJ  s   z_TestArray.test_array_from_sizec                 C   r  r  )r  rx   r   r   r   test_rawarrayY  rk  z_TestArray.test_rawarrayc                 C   s
  |  dttd}| }| }| j dttdd d}| }| }|  }| j dttd|d}| }	| }
| ||	 | j dtddd}| t|d | t|d | j	t
| j dtddd | dtd}| t|d | t|d d S )Nr  r   r  Fr  r  notalock)r  r   r  r  r  r  rl   r   r   r  rF   r  )rR   arr1r  r  arr2r  r  r  arr3r  r  r  r  r   r   r   test_getobj_getlock_obj]  s(   z"_TestArray.test_getobj_getlock_objr  )r\   r]   r^   rs   rn  r  rH   rq  r?   r  r  r  r  r   r   r   r   r  (  s    


r  c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )_TestContainersra   c                 C   s^  |  t td}| |d d  t td |   }| |d d  g  |t td | |d d  t td | |d d | |dd g d |d9 }| |d d  g d | |ddg g d | |d d  t td ||g}|  |}| dd	 |D g d
g dg |  |g}|d | |d d d  g d d S )Nr   r|   r   )r   r  r  )
r   rd   r   r  r  r   rd   r   r  r  r  )r   rd   r   r  r  r   rd   r   r  r  r|   r  c                 S      g | ]}|d d  qS r   r   )r"  elementr   r   r   r#        z-_TestContainers.test_list.<locals>.<listcomp>)
r   rd   r   r  r  r|   r  r  r  	   r   r   )r   rd   r   r  r  r|   r  r  r  r  r   )r   r  rl   extendr  )rR   rh   ri   r  r   r  r   r   r   	test_list  s*   

 z_TestContainers.test_listc                 C   sf   |  t td}t|}| t |t td | t |g  t|}d|d< | t|d d S )Nr   r   r   )r   r  rv  rl   next)rR   rh   itr   r   r   test_list_iter  s   z_TestContainers.test_list_iterc                    s      fddtdD } dd |D g dgd  d|d d<  |d d d  g d	 td
dD ]} || d d  g d q7 |d
  d  t|d
 d tdddD ]} t|| d qb~   }|| ~d S )Nc                    s   g | ]	}  td qS )r  )r   r  )r"  _irx   r   r   r#        z;_TestContainers.test_list_proxy_in_list.<locals>.<listcomp>r  c                 S   r  r   r   )r"  innerr   r   r   r#    r  )r   rd   r   7   r   rC   )r   rd   r  rd   r   )r   r  rl   popr   r  )rR   rh   r  ri   r   rx   r   test_list_proxy_in_list  s    
z'_TestContainers.test_list_proxy_in_listc                 C   s   |   }ttdd}|D ]}t|||< q| | t dd |D  | t| | | t| dd |D  | t|	 dd |D  d S )NA   F   c                 s   s    | ]	}|t |fV  qd S r   chrr!  r   r   r   	<genexpr>  s    z,_TestContainers.test_dict.<locals>.<genexpr>c                 S      g | ]}t |qS r   r  r!  r   r   r   r#    r:  z-_TestContainers.test_dict.<locals>.<listcomp>c                 S   s   g | ]}|t |fqS r   r  r!  r   r   r   r#    r  )
dictr   r  r  rl   r   sortedkeysr  rL  )rR   r  indicesr  r   r   r   	test_dict  s   "z_TestContainers.test_dictc                 C   sv   |   }ttdd}|D ]}t|||< qt|}| t|| | t|g  t|}|  | tt	| d S )Nr  r  )
r  r   r  r  rv  rl   rD  r  r   r  )rR   r  r  r  r  r   r   r   test_dict_iter  s   z_TestContainers.test_dict_iterc                 C   s  | j ddd}| j ddd}| j ||d}| |d d | |d	 d d d
|d	 d< | |d d
 | |d	 d d
 d|d	 d< | |d d | |d	 d d ~~| |d d d d|d	 d< | |d	 d d |d }|d	 }d|d< | |d d | |d	 d d |  | t|d | |d d | |d d | ||g}d|d d< | |d d | |d d d ~~| |d d d | ddg|g}| |d t | |d d d d d S )Nr   r  )ferretshamstersr   r  )waterfeed)petssuppliesr  r  r|   blanketsr  r  r     r   r  rd   marmotsX   c   rC   r  )r  rl   rD  r   r   r   )rR   r  r  r  louterr   r   r   test_dict_proxy_nested  sF   z&_TestContainers.test_dict_proxy_nestedc                 C   sr   |   }||   |d d | |d  d |  }|  |d< |d d | |d  d d S )Nr   {     )r   r  r   r}   rl   r   r  rg   r   r   r   test_nested_queue	  s   z!_TestContainers.test_nested_queuec                 C   sh   |   }d|_d|_d|_| |j|jfd |`| t|d | t|d | t|d  d S )NBobBuilderhidden)r  r  zNamespace(name='Bob')r.   job)	Namespacer.   r  _hiddenrl   rz  r   r   )rR   r  r   r   r   test_namespace	  s   z_TestContainers.test_namespaceN)r\   r]   r^   rs   r  r  r  r  r  r  r  r  r   r   r   r   r  {  s    

.
r  r7   c                 C   s   t | | |  S r   r   )r  r6   r   r   r   sqr	  s   
r  c                 C   s   | | S r   r   r  r  r   r   r   mul	  rr   r  c                 C   s   t |  tdd )Nr  i   )rU   r   rG   r5   r   r   r   raise_large_valuerror!	  rB  r   c                 C      | S r   r   r  r   r   r   identity%	  r  r  c                   @   r  )CountedObjectr   c                 C   s   |  j d7  _ t| S rc   )n_instancesr  __new__r   r   r   r   r  +	  s   
zCountedObject.__new__c                 C   s   t |  jd8  _d S rc   )r   r  rx   r   r   r   __del__/	  s   zCountedObject.__del__N)r\   r]   r^   r  r  r  r   r   r   r   r  (	  s    r  c                   @      e Zd ZdS )SayWhenErrorNr\   r]   r^   r   r   r   r   r	  2	  s    r	  c                 c   s:    |dkr	t dt| D ]}||krt d|V  qd S )NrC   zSomebody said when)r	  r  )totalwhenr  r   r   r   exception_throwing_generator4	  s   r  c                       s(  e Zd Ze fddZe fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Z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d+d, Zed-d.d/d0 Zed1d2 Zed-d.d3d4 Zd5d6 Zd7d8 Z d9d: Z!d;d< Z"  Z#S )=	_TestPoolc                    s   t    | d| _d S r  )super
setUpClassPoolpoolr   	__class__r   r   r  ?	  s   
z_TestPool.setUpClassc                    s(   | j   | j   d | _ t   d S r   )r  r   r   r  tearDownClassr   r  r   r   r  D	  s   

z_TestPool.tearDownClassc                 C   s@   | j j}| |tdtd | |tddditdd d S )N)r|   r|   r   r  r  r  )r  applyrl   r  )rR   papplyr   r   r   
test_applyK	  s   "z_TestPool.test_applyc              	   C   sh   | j j}| |tttdtttttd | |tttdddtttttd d S )Nr   r   rC  	chunksize)r  maprl   r  r   r  )rR   pmapr   r   r   test_mapP	  s
   ,z_TestPool.test_mapc                 C   s   | j j}tttdtddd}| |t|ttt| tttdtddd}| |t|ddttt| d S )Nr   r  rC   r   r  rC  r  )r  starmapr   r  r  rl   r  	itertools)rR   psmaptuplesr   r   r   test_starmapV	  s   z_TestPool.test_starmapc                 C   sD   t ttdtddd}| | jt| t t	t| d S )Nr   r  rC   )
r   r  r  rl   r  starmap_asyncr  r   r  r  )rR   r!  r   r   r   test_starmap_async_	  s   z_TestPool.test_starmap_asyncc              	   C   s8   |  | jtttd tttttd d S r	  )rl   r  	map_asyncr  r   r  r   r  rx   r   r   r   test_map_asyncd	  s   z_TestPool.test_map_asyncc                 C   s   | j dkr
| j ng }| jjtdg|j|jd  | dt	| | dg|d  | jjtdg|j|jd  | dt	| | 
|d t d S )Nra   1)callbackerror_callbackrd   r   rh   r   )r   ra   r   r  r%  r   r  r6   rl   r   r   rG   )rR   	call_argsr   r   r   test_map_async_callbacksh	  s   z"_TestPool.test_map_async_callbacksc                 C   sr   | j dkr| d| j  G dd dt}| t | jt| gd  W d    d S 1 s2w   Y  d S )Nrb   r   c                   @   ry   )z*_TestPool.test_map_unplicklable.<locals>.Ac                 S   rp   )Nzcannot pickler   rx   r   r   r   rq   z	  rr   z5_TestPool.test_map_unplicklable.<locals>.A.__reduce__Nr  r   r   r   r   Ay	  r   r,  r   )	r   r   r   r  r  r   r  r  r  )rR   r,  r   r   r   test_map_unplicklableu	  s   
"z_TestPool.test_map_unplicklablec                 C   sB   z| j jtg ddjtd W d S  tjy    | d Y d S w )Nrd   r  r&   z2pool.map_async with chunksize stalled on null list)r  r%  r  r   r  r   TimeoutErrorr  rx   r   r   r   test_map_chunksize	  s
    z_TestPool.test_map_chunksizec                 C   sh  | j dkr| d| j  | t | jttddd W d    n1 s)w   Y  | t | jttddd W d    n1 sIw   Y  | t | jttddd W d    n1 siw   Y  G dd d}| t | jt| d W d    n1 sw   Y  | t | jt| d W d    d S 1 sw   Y  d S )	Nra   r   rd   rC   r   r  c                   @   r  )zE_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterablec                 S   r  r   r   rx   r   r   r   __iter__	  r  zN_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterable.__iter__c                 S   r  r   )r	  rx   r   r   r   __next__	  r  zN_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterable.__next__c                 S      dS rc   r   rx   r   r   r   rE  	  r  zM_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterable.__len__N)r\   r]   r^   r0  r1  rE  r   r   r   r   SpecialIterable	      r3  )	r   r   r   r  r	  r  r  r  r  )rR   r3  r   r   r   "test_map_handle_iterable_exception	  s$   
"z,_TestPool.test_map_handle_iterable_exceptionc                 C   s<   | j tdtf}t|j}| | d | |jt d S )Nr  1   )	r  apply_asyncr  r  rN   r   rl   rj   rQ   rR   rn   r   r   r   r   
test_async	  s   
z_TestPool.test_asyncc                 C   sD   | j tdtd f}t|j}| jtj|td | 	|j
t d S )Nr  r  r&   )r  r7  r  r  rN   r   r  r   r.  rj   rQ   r8  r   r   r   test_async_timeout	  s   
z_TestPool.test_async_timeoutc              	   C   s   | j tttd}| t|tttttd | j tttd}tdD ]}| t|||  q+| t	|j
 | j jtttddd}tdD ]}| t|||  qP| t	|j
 d S Nr   r  r   r  )r  imapr  r   r  rl   r  r  r  StopIterationr1  rR   r  r  r   r   r   	test_imap	  s   "z_TestPool.test_imapc                 C   s:  | j dkr| d| j  | jttddd}| t|j	 | jttddd}| t|j	 | jttddd}t
dD ]}| t|||  qA| t|j	 | jttddd	}t
d
D ]}| t|||  qd| t|j	 | jttddd}t
dD ]}| t|||  q| t|j	 d S )Nra   r   rd   rC   r   r  rC  r  r   r  r  )r   r   r   r  r<  r  r  r  r	  r1  r  rl   r  r>  r   r   r   #test_imap_handle_iterable_exception	  s$   
z-_TestPool.test_imap_handle_iterable_exceptionc              	   C   sx   | j tttd}| t|tttttd | j jtttddd}| t|tttttd d S r;  )r  imap_unorderedr  r   r  rl   r  r  )rR   r  r   r   r   test_imap_unordered	  s   "&z_TestPool.test_imap_unorderedc                 C   sn  | j dkr| d| j  | jttddd}| t|j	 | jttddd}| t|j	 | jttddd}t
ttt
td}| t tdD ]}t|}| || || qRW d    n1 snw   Y  | jttddd	}t
ttt
td}| t tdD ]}t|}| || || qW d    d S 1 sw   Y  d S )
Nra   r   rd   rC   r   r  rC  r  r   )r   r   r   r  rA  r  r  r  r	  r1  r   r  r  r  r   rK  )rR   r  expected_valuesr  rm   r   r   r   -test_imap_unordered_handle_iterable_exception	  sH   
"z7_TestPool.test_imap_unordered_handle_iterable_exceptionc                 C   s   | j dkrtnt}| || jd | || jd | j dkrA| d}z| dt|j W |  |	  d S |  |	  w d S )Nra   rC   r   r  )
r   RemoteErrorrG   r  r  rl   r   _poolr    r   )rR   expected_errorr   r   r   r   test_make_pool	  s   


z_TestPool.test_make_poolc                 C   sP   | j jtjdd tdD dd}| j   t| j j}|  | |j	d d S )Nc                 S   s   g | ]}d qS )r2   r   r!  r   r   r   r#  
      z,_TestPool.test_terminate.<locals>.<listcomp>i'  rd   r  ra  )
r  r%  rU   r   r  r   rN   r   
assertLessrQ   )rR   r  r   r   r   r   r   
  s   
z_TestPool.test_terminatec                 C   sz   |  d}| |tg g  | t|tg g  | t|tg g  | |tg  g  |	  |
  d S rc   )r  rl   r  r  r   r<  rA  r%  r   r    r   r   r   r   r   test_empty_iterable
  s   
z_TestPool.test_empty_iterablec                 C   s   | j dkrDttd}dd |D }| d}|t|}| | | W d    n1 s0w   Y  |  | 	t
|jt| d S d S )Nr`   r   c                 S   r  r   )r  r!  r   r   r   r#  &
  r:  z*_TestPool.test_context.<locals>.<listcomp>r   )r   r   r  r  r%  r  rl   r   r   r  rG   )rR   Lr  r   rr   r   r   test_context#
  s   
z_TestPool.test_contextc                 C   rp   )Nr  r   r   r   r   r   _test_traceback-
     z_TestPool._test_tracebackTr  c                 C   s  | j dkr| d*}z|| j W n ty' } z|}W Y d }~n
d }~ww | d W d    n1 s7w   Y  |  | t|t	 | 
|jd |j}| t|tjj | d|j tj }z| t	y{   tjt   Y nw W d    n1 sw   Y  | d|  | d=}z|ttddd W n ty } z|}W Y d }~n
d }~ww | d | t|t | |jd  W d    n1 sw   Y  |  d S d S )Nr`   rd   zexpected RuntimeError)r  z&raise RuntimeError(123) # some commentrC   zexpected SayWhenError)r   r  r  rO  	Exceptionr  r   r  r   r   rl   rW   	__cause__r   r  RemoteTracebackr   tbr  r   r  r  
excepthookexc_infogetvaluer  r  r  r	  )rR   r   r   exccausef1r   r   r   test_traceback1
  sR   


	z_TestPool.test_tracebackc                 C   rp   )Nr  r   r   r   r   r   _test_wrapped_exceptionX
  rP  z!_TestPool._test_wrapped_exceptionc              	   C   sl   |  d#}| t || j W d    n1 sw   Y  W d    n1 s+w   Y  |  d S rc   )r  r  r   r  r\  r   r   r   r   r   test_wrapped_exception\
  s   z _TestPool.test_wrapped_exceptionc                 C   s   t  }| tC | d.}z|tddg W t d |  |	  nt d |  |	  w W d    n1 s@w   Y  W d    n1 sOw   Y  | 
t  | d d S )Nr   r   rd   r>  g?)rU   rV   r  rG   r  r  r   r   r    r   assertGreater)rR   t_startr   r   r   r   test_map_no_failfastd
  s   



z_TestPool.test_map_no_failfastc                 C   sp   dd t dD }dd |D }| jt| ~t  tt | 	t
dd |D d h | 	tjd d S )Nc                 S   s   g | ]}t  qS r   )r  r!  r   r   r   r#  {
      z4_TestPool.test_release_task_refs.<locals>.<listcomp>r   c                 S   s   g | ]}t |qS r   )r  r  )r"  or   r   r   r#  |
  s    c                 s   s    | ]}| V  qd S r   r   )r"  r  r   r   r   r  
      z3_TestPool.test_release_task_refs.<locals>.<genexpr>r   )r  r  r  r  r  r  rU   r   r   rl   r  r  r  )rR   objsrefsr   r   r   test_release_task_refsx
  s   
z _TestPool.test_release_task_refsc              	   C   s   | j dkr
| d | d}| W d    n1 sw   Y  | t | W d    n1 s4w   Y  W d    n1 sCw   Y  |  d S )Nra   test not applicable to managerrd   )r   r   r  r  rG   r   rR   r  r   r   r   
test_enter
  s   


z_TestPool.test_enterc                 C   sx   | j dkr
| d | d}|  |  tjj|_t	
dtf d }t  W d    d S 1 s5w   Y  d S )Nra   rg  rd   z%unclosed running multiprocessing pool)r   r   r  r   r   r   r  RUN_stater   check_warningsResourceWarningr   
gc_collectrh  r   r   r   test_resource_warning
  s   




"z_TestPool.test_resource_warning)$r\   r]   r^   rn  r  r  r  r  r"  r$  r&  r+  r-  r/  r5  r9  r:  r?  r@  rB  rD  rH  r   rK  rN  rO  rH   rq  r[  r\  r]  r`  rf  ri  ro  __classcell__r   r   r  r   r  =	  sH    	
$




&


r  c                   C   rp   )Nkey)KeyErrorr   r   r   r   raising
  rr   rs  c                   C   s   dd S )Nc                   S   r2  )N*   r   r   r   r   r   r  
  s    z%unpickleable_result.<locals>.<lambda>r   r   r   r   r   unpickleable_result
  rr   ru  c                   @   r  )_TestPoolWorkerErrorsr~  c                    sj   t d}d g  fdd}|jt|d}| t|j |  d  |  d t |	  |
  d S )Nr   c                       |  d< d S r%  r   rX  
scratchpadr   r   errback
  r   z@_TestPoolWorkerErrors.test_async_error_callback.<locals>.errbackr)  r   )r   r  r7  rs  r  rr  r   r   r   r    r   )rR   r   r{  rn   r   ry  r   test_async_error_callback
  s   
z/_TestPoolWorkerErrors.test_async_error_callbackc                    s   ddl m} td}tdD ]6}d g  fdd}|jt|d}| ||j  d }| 	| | 
 d | | |j | |j q|  |  d S )Nr   )MaybeEncodingErrorr   rC  c                    rw  r%  r   rx  ry  r   r   r{  
  r   z@_TestPoolWorkerErrors._test_unpickleable_result.<locals>.errbackr|  )multiprocess.poolr~  r   r  r  r7  ru  r  r   r   r   assertIsNotNonerX  rm   r    r   )rR   r~  r   	iterationr{  rn   wrappedr   ry  r   _test_unpickleable_result
  s   

z/_TestPoolWorkerErrors._test_unpickleable_resultN)r\   r]   r^   rs   r}  r  r   r   r   r   rv  
  s    rv  c                   @   0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )_TestPoolWorkerLifetimer~  c           	      C   s  t jddd}| dt|j dd |jD }g }tdD ]}||t|f qt	|D ]\}}| |
 t| q/|  d}|retdd	 |jD se|d
8 }tt |retdd	 |jD rPdd |jD }| d | | d | | t|t| |  |  d S )Nr  r   maxtasksperchildc                 S      g | ]}|j qS r   r   r"  r  r   r   r   r#  
  ra  zE_TestPoolWorkerLifetime.test_pool_worker_lifetime.<locals>.<listcomp>r   2   c                 s       | ]}|  V  qd S r   r   r  r   r   r   r  
      zD_TestPoolWorkerLifetime.test_pool_worker_lifetime.<locals>.<genexpr>rd   c                 S   r  r   r  r  r   r   r   r#  
  ra  )r   r  rl   r   rF  r  r  r7  r  	enumerater   _repopulate_poolallrU   r   r   r   r   r  r    r   )	rR   r   origworkerpidsrg  r  r  rn   	countdownfinalworkerpidsr   r   r   test_pool_worker_lifetime
  s(   
z1_TestPoolWorkerLifetime.test_pool_worker_lifetimec                 C   sp   t jddd}g }tdD ]}||t|df q|  |  t|D ]\}}| 	|
 t| q'd S )Nr  rd   r  r  g333333?)r   r  r  r  r7  r  r    r   r  rl   r   )rR   r   rg  r  r  rn   r   r   r   %test_pool_worker_lifetime_early_close
  s   z=_TestPoolWorkerLifetime.test_pool_worker_lifetime_early_closec              	   C   sF   dD ]}|  t tjd|d W d    n1 sw   Y  qd S )N)r   rC   r>  12r  r  )r  rG   r   r  )rR   rm   r   r   r   "test_pool_maxtasksperchild_invalid  s   z:_TestPoolWorkerLifetime.test_pool_maxtasksperchild_invalidc                 C   s2   d}t jjjd|fi t\}}}| |d d S )Na  if 1:
            from multiprocess import Pool
            problem = None
            class A:
                def __init__(self):
                    self.pool = Pool(processes=1)
            def test():
                global problem
                problem = A()
                problem.pool.map(float, tuple(range(10)))
            if __name__ == "__main__":
                test()
        -cr   )r  r   script_helperassert_python_okENVrl   rR   cmdr  outr  r   r   r   >test_worker_finalization_via_atexit_handler_of_multiprocessing  s   zV_TestPoolWorkerLifetime.test_worker_finalization_via_atexit_handler_of_multiprocessingN)r\   r]   r^   rs   r  r  r  r  r   r   r   r   r  
  s    r  )BaseManager	BaseProxyrE  c                   @   r  )FooBarc                 C   r2  )Nf()r   rx   r   r   r   r     r  zFooBar.fc                 C   r  r   )rG   rx   r   r   r   g"  r  zFooBar.gc                 C   r2  )N_h()r   rx   r   r   r   _h$  r  z	FooBar._hN)r\   r]   r^   r  r  r  r   r   r   r   r    r4  r  c                  c   s    t dD ]} | |  V  qd S r	  )r  )r  r   r   r   baz'  s   r  c                   @   r  )IteratorProxy)r1  c                 C   r  r   r   rx   r   r   r   r0  -  r  zIteratorProxy.__iter__c                 C   r   )Nr1  )_callmethodrx   r   r   r   r1  /  r   zIteratorProxy.__next__N)r\   r]   r^   	_exposed_r0  r1  r   r   r   r   r  +  s    r  c                   @   r  )	MyManagerNr
  r   r   r   r   r  2      r  Foo)callableBar)r  r  )r  exposed)r  	proxytypec                   @   r  )_TestMyManagerr  c                 C   s<   t  }|  | | |  | |jjdtj f d S r%  )	r  r   commonshutdownr   _processr   r   r   rR   ra   r   r   r   test_mymanager>  s
   
z_TestMyManager.test_mymanagerc                 C   sL   t  }| | W d    n1 sw   Y  | |jjdtj f d S r%  )r  r  r   r  r   r   r   r  r   r   r   test_mymanager_contextI  s   z%_TestMyManager.test_mymanager_contextc                 C   sP   t  }|  | | | W d    n1 sw   Y  | |jjd d S r%  )r  r   r  rl   r  r   r  r   r   r   !test_mymanager_context_prestartedQ  s   z0_TestMyManager.test_mymanager_context_prestartedc                    s  |  |  | }fdddD } fdddD }| |ddg | |ddg |  d | tj | dd | t	jd |   d |  
 d	 |  dd |  dd	 | t|d
d tdD  d S )Nc                       g | ]	}t  |r|qS r   r   r"  r.   )r  r   r   r#  ]  r  z)_TestMyManager.common.<locals>.<listcomp>)r  r  r  c                    r  r   r  r  )barr   r   r#  ^  r  r  r  r  r  r  c                 S   s   g | ]}|| qS r   r   r!  r   r   r   r#  m  r:  r   )r  r  r  rl   r  r  rG   r  r  rE  r  r   r  )rR   ra   r  foo_methodsbar_methodsr   )r  r  r   r  X  s    "z_TestMyManager.commonN)r\   r]   r^   rs   r  r  r  r  r   r   r   r   r  :  s    r  c                   C   s   t S r   )_queuer   r   r   r   	get_queueu  r  r  c                   @      e Zd ZdZdS )QueueManagerz$manager class used by server processNr\   r]   r^   r  r   r   r   r   r  x      r  c                   @   r  )QueueManager2z@manager class which specifies the same interface as QueueManagerNr  r   r   r   r   r  |  r  r  	xmlrpclibc                   @   s8   e Zd ZdZg dZedd Zedd Zdd ZdS )_TestRemoteManagerr  )hello worldNT      @u   hallå världenu   привіт світs   hall vrldenNc                 C   s2   t ||td}|  | }|t| j d S )Nr   r   
serializer)r  
SERIALIZERconnectr  r}   tupler  r   r   r   ra   r#   r   r   r   _putter  s   z_TestRemoteManager._putterc                 C   s   t d}ttjdf|td}|  | |j | j	| j
|j|fd}d|_|  t|j|td}|  | }| | | j | t|jtj ~d S )N    r   r  r   T)rD   urandomr  r   HOSTr  r   r  r  r   r  r   r   r  r  r  rl   r   r  r  rQ  r}   rU   r   )rR   r   ra   r   manager2r#   r   r   r   test_remote  s"   
z_TestRemoteManager.test_remote)	r\   r]   r^   rs   r  r  rn  r  r  r   r   r   r   r    s    
	r  md5c                   @   r1  )_TestManagerRestartc                 C   s,   t ||td}|  | }|d d S )Nr  r  )r  r  r  r  r}   r  r   r   r   r    s   z_TestManagerRestart._putterc              
   C   sF  t d}ttjdf|td}z;| }|j}|j	  |
  | j| j|j|fd}|
  |  | }| | d ~W t|drJ|  nt|drU|  w w t||td}z|
  | |j W d S  ty } z,|jtjkry td t||td}t|dr| |j W Y d }~d S W Y d }~d S d }~ww )Nr  r   r  r   r  r  r  )rD   r  r  r   r  r  
get_serverr   listenerr    r   r   r  r   r  rl   r   r   r  r  OSErrorerrno
EADDRINUSErU   r   )rR   r   ra   srvraddrr   r#   r   r   r   r   test_rapid_restart  sN   






z&_TestManagerRestart.test_rapid_restartN)r\   r]   r^   rn  r  r  r   r   r   r   r    s    
r   c                   @   s   e Zd ZdZedd Zdd Zdd Zdd	 Zd
d Z	edd Z
ed$ddZeeddd Zeedeejdkdeedkdeeedddd Zedd Zeedeejdkddd  Zd!d" Zd#S )%_TestConnectionr   c                 C   s(   t |jtD ]}|| q|  d S r   )rv  
recv_bytesSENTINEL
send_bytesr    )r   r  msgr   r   r   _echo  s   z_TestConnection._echoc              
   C   sL  |   \}}| j| j|fd}d|_|  g d}td}|d }tdttd}| j	dkr;| 
t| t | 
||d  | 
| | | 
||d  | 
| | | j	dkrtdd	gd }t|d	gdt|   }	| 
||d  | 
||t||j  | 
t||	 tdd	gd }d	gd
 t| d	gdt|   }	| 
||d  | 
||d
|j t||j  | 
t||	 ttd}| 
||d  z||}
W n tjy } z| 
|j|f W Y d }~nd }~ww | d|
  t|j}| 
| d | |jd	 | 
|dd | |jd	 | 
|td | |jt |d  t d | 
|td | |jd	 | 
| d  tdd }|| | 
| | |t! |"  | j	dkr| 
|j#d | 
|j$d | %t&|j | %t&|j |'  d S )Nr   T)rd   r  Nr  r   r  r  r`   r   r  r  z(                                        zexpected BufferTooShort, got %sFrC   r2   Xi   )(r   r   r  r   r   r   r  r   r  r   rl   r   filenor   r   r   r  r  r   recv_bytes_intoitemsize	bytearrayr   BufferTooShortrW   r  rN   r   rj   rQ   r  rU   r   r  r    readablewritabler  EOFErrorr   )rR   r  rt  r   r  r  longmsgr  bufferr  rn   r   r   really_big_msgr   r   r   test_connection  sz   
$




z_TestConnection.test_connectionc                 C   s   | j dd\}}| |dd  | | d | jdkrR| |jd | |jd | |jd | |jd | t|jd | t|j | t|j	 d S d S )NFr   rd   r`   Tr   )
r   rl   r   r   r   r  r  r  r  r   )rR   readerwriterr   r   r   test_duplex_falseD  s   
z!_TestConnection.test_duplex_falsec                 C   st   |   \}}| j| j|fd}d|_|  |  td}|| | |	 | |t
 |  |  d S )Nr   Tr   )r   r   r  r   r   r    r   r  rl   r  r  r   )rR   r  rt  r   r  r   r   r   test_spawn_closeQ  s   

z _TestConnection.test_spawn_closec                 C   s:  | j dkr| d| j  td}|  \}}|| | | | ||d | | |dd   ||dd | | |dd  ||d | | td	 ||dd
 | | td	 | t	|j|d | t	|j|dd | t	|j|dd | t	|j|d | t	|j|dd d S )Nr`   r   abcdefghijklmnopqrstuvwxyzr|   r  r        r  r         rd   rC   r  )
r   r   r   r   r   r  rl   r  r  rG   )rR   r  rh   ri   r   r   r   test_sendbytesf  s&   

z_TestConnection.test_sendbytesc              
   C   sF   zt | W dS  ty" } z|jtjkrW Y d }~dS  d }~ww )NFT)rD   fstatr  r  EBADF)r   r  r   r   r   r   _is_fd_assigned  s   z_TestConnection._is_fd_assignedFc                 C   sd   |rt ddD ]}| |st| | qt|}tr%t|tj	}t
|| t| d S )Nr   r;   )r  r  rD   dup2r  r   recv_handlemsvcrtopen_osfhandler  r  r    )r   r  datacreate_dummy_fdsr  r  r   r   r   _writefd  s   

z_TestConnection._writefd$test needs multiprocessing.reductionc                 C   s   | j dkr
| d | jdd\}}| j| j|dfd}d|_|  | tj	tj
 ttj
d}| }tr=t|}t|||j W d    n1 sOw   Y  |  ttj
d}| | d W d    d S 1 srw   Y  d S )	Nr`   only makes sense with processesTr   s   foor   wbrb)r   r   r   r   r	  r   r   r  r   r  r  r  r  r  get_osfhandler   send_handler   r   rl   r  )rR   r  rt  r   r  r  r   r   r   test_fd_transfer  s"   


"z _TestConnection.test_fd_transferr4   *test semantics don't make sense on Windowsr;   z)largest assignable fd number is too smallr  ztest needs os.dup2()c              
   C   s6  | j dkr
| d | jdd\}}| j| j|ddfd}d|_|  | tj	tj
 ttj
d<}| }tdtD ]	}| |sE nq<| d	 t|| zt|||j W t| nt| w W d    n1 sqw   Y  |  ttj
d
}| | d W d    d S 1 sw   Y  d S )Nr`   r  Tr   s   barr   r  r;   z2could not find an unassigned large file descriptorr  )r   r   r   r   r	  r   r   r  r   r  r  r  r  r  MAXFDr  r  rD   r  r   r  r   r    r   rl   r  )rR   r  rt  r   r  r  newfdr   r   r   test_large_fd_transfer  s.   
	


"z&_TestConnection.test_large_fd_transferc                 C   s   t | d d S )N    )rD   r  r  rR   r  r   r   r   _send_data_without_fd     z%_TestConnection._send_data_without_fdzdoesn't make sense on Windowsc                 C   s`   | j dkr
| d | jdd\}}| j| j|fd}d|_|  | tt	j
| |  d S )Nr`   r  Tr   r   )r   r   r   r   r  r   r   r  r   r   r  r   rR   r  rt  r   r   r   r   test_missing_fd_transfer  s   

z(_TestConnection.test_missing_fd_transferc              	   C   s   |   \}}|8 |& |d | | d | jdkr*| |j | |j W d    n1 s4w   Y  W d    n1 sCw   Y  | jdkri| |j | |j | t	|j | t	|j d S d S N  r`   )
r   r   rl   r   r   r   closedr   r  r  rg   r   r   r   rN    s"   

 
z_TestConnection.test_contextNr  )r\   r]   r^   rs   rn  r  r  r  r  r  r  r	  rH   ro  HAS_REDUCTIONr  rq  r  r(  r  r   rD   r  r  r  rN  r   r   r   r   r    s>    
O 







r  c                   @   s6   e Zd ZdZdd Zdd Zeej	ddd Z
d	S )
_TestListenerr~  c                 C   sB   | j jD ]}| j j|d}| |j | t| j j|j| qd S )Nfamily)
connectionfamiliesListenerr  r    r  r  r   )rR   r!  r  r   r   r   test_multiple_bind  s   z _TestListener.test_multiple_bindc              
   C   s   | j  @}| j |j)}| }|d | | d W d    n1 s*w   Y  W d    n1 s9w   Y  W d    n1 sHw   Y  | jdkr[| 	t
|j d S d S r  r"  r$  Clientr   acceptr   rl   r   r   r  r  )rR   r  r   r  r   r   r   rN    s   


z_TestListener.test_contextz"test needs abstract socket supportc              
   C   s   | j d@}| j |j)}| }|d | | d W d    n1 s+w   Y  W d    n1 s:w   Y  W d    n1 sIw   Y  | jdkr\| 	t
|j d S d S )Nz
 somethingr  r`   r&  )rR   r  clientr  r   r   r   test_abstract_socket	  s   


z"_TestListener.test_abstract_socketN)r\   r]   r^   rs   r%  rN  rH   ro  r
   abstract_sockets_supportedr*  r   r   r   r   r    s    
r  c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )_TestListenerClientr   c                 C   s"   | j |}|d |  d S )Nr   )r"  r'  r   r    )r   r   r  r   r   r   r     s   
z_TestListenerClient._testc                 C   sj   | j jD ].}| j j|d}| j| j|jfd}d|_|  | }| 	|
 d |  |  qd S )Nr   r   Tr   )r"  r#  r$  r   r   r   r   r   r(  rl   r   r   r    )rR   r!  r  r   r  r   r   r   test_listener_client   s   
z(_TestListenerClient.test_listener_clientc                 C   sj   | j  }| j| j|jfd}d|_|  td |	 }| 
| d |  |  |  d S )Nr   Trd   r   )r"  r$  r   r   r   r   r   rU   r   r(  rl   r   r    r   )rR   r  r   r  r   r   r   test_issue14725+  s   

z#_TestListenerClient.test_issue14725c                 C   sh   | j jD ]-}| j j|d}| j |j}| }|d | |d |	  |	  |	  qd S )Nr      hellord   )
r"  r#  r$  r'  r   r(  r  r   r   r    )rR   famr  r   rh   r   r   r   test_issue16955;  s   

z#_TestListenerClient.test_issue16955N)	r\   r]   r^   rs   rn  r   r-  r.  r1  r   r   r   r   r,    s    
r,  c                   @   sT   e Zd ZdZdd Zedd Zdd Zedd	 Zd
d Z	edd Z
dd ZdS )	_TestPollr   c                 C   sJ   |   \}}| | d |d | | d | | d d S )NF    T)r   rl   r   r  rg   r   r   r   test_empty_stringJ  s
   
z_TestPoll.test_empty_stringc                 C   s*   |D ]}t d || q|  d S Nr2   )rU   r   r  r    )r   r  stringsr   r   r   r   _child_stringsQ  s   
z_TestPoll._child_stringsc                 C   sr   d}|   \}}| j| j||fd}|  |D ]}tdD ]	}|dr' nq| }| || q|  d S )N)r/  r3     a   br3  s   byer3  s   lopr      r   )	r   r   r7  r   r  r   r  rl   r   )rR   r6  rh   ri   r   r   r  r  r   r   r   test_stringsX  s   
z_TestPoll.test_stringsc                 C   r
  r{   )r   )r   rM  r   r   r   _child_boundariesg  s   z_TestPoll._child_boundariesc                 C   sr   |  d\}}| j| j|fd}|  td ddg}|D ]}|| q|  |  | 	|
 | d S )NFr   r   s   firsts   second)r   r   r<  r   rU   r   r  r    r   r   r  )rR   rM  r  r   rL  r  r   r   r   test_boundarieso  s   
z_TestPoll.test_boundariesc                 C   s"   | d | d | d d S )Nr8  r9     cd)r  )r   ri   r   r   r   _child_dont_merge{  s   

z_TestPoll._child_dont_mergec                 C   s   |   \}}| |dd | |dd | j| j|fd}|  | | d | |dd | |dd | | d | |dd | |dd | |dd | | d	 |  d S )
Nr7   Fr2   r   r8  r  Tr9  r>  )r   rl   r   r   r?  r   r  r   )rR   rh   ri   r   r   r   r   test_dont_merge  s   z_TestPoll.test_dont_mergeN)r\   r]   r^   rs   r4  rn  r7  r;  r<  r=  r?  r@  r   r   r   r   r2  F  s    


r2  r
  c                   @   sP   e Zd ZdZedd Zedd Zedd Zdd	 Zed
d Z	dd Z
dS )_TestPicklingConnectionsr~  c                 C   s   ddl m} |jtjd d S )Nr   )resource_sharerr&   )multiprocessrB  r|  r   r   )r   rB  r   r   r   r    s   z&_TestPicklingConnections.tearDownClassc                 C   s   |D ] }| j j|d}||j | }|| |  |  qttj	df}||
  | \}}|| |  |  |  d S )Nr   r   )r"  r$  r   r   r(  r    socketcreate_serverr   r  getsocknamer   )r   r  r#  r0  r  new_connr  r   r   r   	_listener  s   


z"_TestPicklingConnections._listenerc                 C   sx   t |jd D ]\}}| j|}||  |  q| \}}t }|| |	|  |  |  d S r   )
rv  r   r"  r'  r   rw  r    rD  r  sendall)r   r  r   r  r)  r   r   r   _remote  s   

z _TestPicklingConnections._remotec                 C   s^  | j j}|  \}}| j| j||fd}d|_|  |  |  \}}| j| j|fd}d|_|  |  |D ]"}d| 	d}	|
 }
||
|	f |
 }| |
 |	  q;|d  td}	|
 }
||
|	f |
 }g }	 |
d}|sn|| qyd|}| ||	  |  |d  |  |  |  |  d S )Nr   TzThis connection uses family %sasciiz$This connection uses a normal socketr   r3  )r"  r#  r   r   rH  r   r   r    rJ  r   r   r   rl   rw  r   r  r   )rR   r#  lconnlconn0lpr   rconn0rpr0  r  r   rG  bufr   r   r   r   test_pickling  sJ   




z&_TestPicklingConnections.test_picklingc                 C   sD   |  }|d |  |  }|  }||d  |  d S )Nall is wellr   )r   r   r    )r   r  r  rM  r  r   r   r   child_access  s   
z%_TestPicklingConnections.child_accessc                 C   s   |   \}}| j| j|fd}d|_|  |  | j dd\}}|| |  | | d |  | j dd\}}|| |  |d |  | | d |	  d S )Nr   TFr   rS  foobarfoobarfoobar)
r   r   rT  r   r   r    r   rl   r   r   )rR   r  rt  r   rM  r  r   r   r   test_access  s"   


z$_TestPicklingConnections.test_accessN)r\   r]   r^   rs   rn  r  rH  rJ  rR  rT  rW  r   r   r   r   rA    s    


.
rA  c                       s<   e Zd ZdZ fddZ fddZdd Zdd	 Z  ZS )
	_TestHeapr~  c                    s*   t    tjjj| _tj tjj_d S r   )r  r`  r   r6  r7  _heapold_heapHeaprx   r  r   r   r`  $  s   
z_TestHeap.setUpc                    s   | j tjj_t   d S r   )rZ  r   r6  r7  rY  r  rb  rx   r  r   r   rb  *     z_TestHeap.tearDownc              
   C   sb  d}d}g }t jjj}d|_t|D ]&}ttddd }t j|}|	| t
||kr7t|}||= ~q|j g }d}	d}
t|j D ] }|D ]\}}}|	|j||||| df |	|| 7 }	qNqJ|j D ]!\}}|D ]\}}|	|j||||| df |
|| 7 }
qvqp| |	|
 tdd	 |jD  |  tt
|d D ]5}|| d d
 \}}}||d  d d
 \}}}||kr| ||j| j | |d q| || qW d    n1 sw   Y  t| |r|  |s| |j|j | t
|jd | t
|jd | t
|jd|j | t
|jd d S )N  r  r   rd   r  freeoccupiedc                 s   s    | ]}|j V  qd S r   r  )r"  arenar   r   r   r  T  rc  z&_TestHeap.test_heap.<locals>.<genexpr>r  )r   r6  r7  rY  _DISCARD_FREE_SPACE_LARGER_THANr  r   randomlognormvariater  r   	randranger>  r   _len_to_seqr  _arenasindex_allocated_blocksrL  rl   sumsortr  shuffler  _n_frees
_n_mallocs_pending_free_blocks)rR   
iterations	maxblocksblocksr6  r  r  ri   r  r^  r_  rL  ra  r   r|  arena_blocksnarenanstartnstopr   r   r   	test_heap.  sj   




"z_TestHeap.test_heapc                 C   sx   t  st   | t j t  }| jt jg|R   t d tdD ]}tj	
d}tj	
d}||_||_q%d S )Nr   r]  rd   )r  	isenabledenabler  disableget_thresholdset_thresholdr  r   r6  r7  buddy)rR   
thresholdsr  rh   ri   r   r   r   test_free_from_gcn  s   
z_TestHeap.test_free_from_gc)	r\   r]   r^   rs   r`  rb  rw  r  rp  r   r   r  r   rX     s    @rX  c                   @   s"   e Zd ZdefdefdefgZdS )_Foor  r  zN)r\   r]   r^   r?   r@   rA   _fields_r   r   r   r   r    s
    r  c                   @   s>   e Zd ZdZdd Zedd ZdddZd	d
 Zdd Z	dS )_TestSharedCTypesr~  c                 C   r  r  r  rx   r   r   r   r`    r  z_TestSharedCTypes.setUpc                 C   sz   | j d9  _ | j d9  _ | j d9  _ | jd9  _| jd9  _| j d9  _ tt|D ]
}||  d9  < q0d S r  )rm   r  r  r  r   )r   r  r  r  r  r  stringr  r   r   r   _double  s   z_TestSharedCTypes._doubleFc           
      C   s  t dd|d}t td|d}t td|d}t tdd|d}| jdttd	|d}| jd
d|d}td|_| j	| j
||||||fd}d|_|  |  | |jd | |jd | |jd | |jd | |jd td	D ]}	| ||	 |	d  qv| |jtd d S )Nr  r  r  gUUUUUU?r  r  r   r  r   r   rC  r   r   T   gUUUUUU?r  r        @
hellohello)r   r@   rA   r  r  r   r  r   rm   r   r  r   r   r   rl   rf   r  r  )
rR   r  r  r  r  r  r  r  r   r  r   r   r   test_sharedctypes  s&   
z#_TestSharedCTypes.test_sharedctypesc                 C   r  )NTr  )r  rx   r   r   r   test_synchronize  rZ  z"_TestSharedCTypes.test_synchronizec                 C   sT   t ddd}t|}d|_d|_d|_| |jd | |jd | |jd d S )Nr         @r  r   )r  r   r  r  r  rl   rf   )rR   r  r  r   r   r   	test_copy  s   z_TestSharedCTypes.test_copyNr  )
r\   r]   r^   rs   r`  rn  r  r  r  r  r   r   r   r   r    s    


r  z#requires multiprocess.shared_memoryc                   @   s   e Zd ZdZedd Zdd Zdd Ze	dd	d
d Z
dd Zdd Zdd Zdd Ze	ejdkddd Ze	ejdkddd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%S )&_TestSharedMemoryr~  c                 C   s8   t | trt| }n| }||jd t|< |  d S r   )r   rz  r   SharedMemoryrQ  r   r    )shmem_name_or_objbinary_data	local_smsr   r   r   !_attach_existing_shmem_then_write  s
   
z3_TestSharedMemory._attach_existing_shmem_then_writec                 C   s   |t t  S r   )rz  rD   r   )rR   prefixr   r   r   _new_shm_name  s   z_TestSharedMemory._new_shm_namec              	      sp  |  d}tj|ddd}| |j | |j| | |jd | t	|j
|j | |jt| | t|jt| d|j
d< | |j
d d t|}| |j
d d |  tj|d|j d}| |jd|j  |  | t tjdd	d W d    n1 sw   Y  | t tjd
d W d    n1 sw   Y  tjdP}tj |  d|  dg} fdd|D }||_tjddd}| |j | |j|d  ||_tjddd}| |j | |j|d  W d    n	1 sw   Y  tjrX|  d}	tj|	ddd}
| t, z| |
jd t|	}|  |  |
  W |
  n|
  w W d    n	1 sSw   Y  | t tj|ddd}W d    n	1 sqw   Y  tjrG dd dtj}||}| |j|j |  | t td}|  W d    n	1 sw   Y  |  d S )Ntest01_tsmbT   creater  rt  r   rC  r`  Fr  )multiprocess.shared_memory._make_filename	test01_fn	test02_fnc                       g | ]} | qS r   r   r  NAME_PREFIXr   r   r#  	  r:  z?_TestSharedMemory.test_shared_memory_basics.<locals>.<listcomp>rd   test01_dblunlinkr]  c                   @   s   e Zd ZejejB ZdS )zO_TestSharedMemory.test_shared_memory_basics.<locals>.OptionalAttachSharedMemoryN)r\   r]   r^   rD   r  O_RDWR_flagsr   r   r   r   OptionalAttachSharedMemory>      r  test01_notthere)r  r   r  r  r  rl   r.   r  r  r   rQ  r   rz  r    rJ  r  rG   rH   mockpatch_SHM_NAME_PREFIXside_effect_name
_USE_POSIXFileNotFoundErrorFileExistsError)rR   	name_tsmbsmsalso_smssame_smsmock_make_filenamenamesshm1shm2name_dblunlinksms_unosms_duothere_can_only_be_one_smsr  ok_if_exists_smsnonexisting_smsr   r  r   test_shared_memory_basics  s   





	

z+_TestSharedMemory.test_shared_memory_basicsTzfails with dill >= 0.3.5c                    s   t jdQ}tj | d| dg} fdd|D }||_tjddd}| |j	 | 
|j|d	  ||_tjddd}| |j	 | 
|j|d  W d    d S 1 sZw   Y  d S )
Nr  	test03_fn	test04_fnc                    r  r   r   r  r  r   r   r#  W  r:  zA_TestSharedMemory.test_shared_memory_recreate.<locals>.<listcomp>Trd   r  r   )rH   r  r  r   r  r  r  r  r  r  rl   r  )rR   r  r  r  r  r   r  r   test_shared_memory_recreateL  s    "z-_TestSharedMemory.test_shared_memory_recreatec                 C   s   |  t tjddd}W d    n1 sw   Y  |  t tjddd}W d    n1 s3w   Y  |  t tjdd}W d    d S 1 sOw   Y  d S )NTrC   r  r   r  )r  rG   r   r  )rR   sms_invalidr   r   r   "test_invalid_shared_memory_crationc  s   "z4_TestSharedMemory.test_invalid_shared_memory_crationc              	   C   sZ  t tjd D ]}| j|d tjddd}| |j d|jdd< tj	||d	}t
|}| |tj | |j|j | t|jdd d | t|jdd d d
|jdd< | t|jdd d
 | t|jdd d
 d|jdd< | t|jdd d | t|jdd d W d    n1 sw   Y  qd S )Nrd   protoTr  r     pickler   r  protocols   newvals   oldval)r  pickleHIGHEST_PROTOCOLr  r   r  r  r  rQ  dumpsloadsr   rl   r.   r   )rR   r  r  pickled_smssms2r   r   r   "test_shared_memory_pickle_unpicklep  s(   
z4_TestSharedMemory.test_shared_memory_pickle_unpicklec              
   C   s   t tjd D ]O}| j|d? tjddd}d|jdd< tj||d	}|  |	  | 
t t| W d    n1 sBw   Y  W d    n1 sQw   Y  qd S )
Nrd   r  Tr  r  r  r   r  r  )r  r  r  r  r   r  rQ  r  r    r  r  r  r  )rR   r  r  r  r   r   r   .test_shared_memory_pickle_unpickle_dead_object  s   z@_TestSharedMemory.test_shared_memory_pickle_unpickle_dead_objectc                 C   s   t jddd}| |j | j| j|jdfd}d|_|  |	  | 
t|jd d d | j| j|dfd}d|_|  |	  | 
t|jd d d |  d S )NTr  r  s   howdyr   r|   s   HELLO)r   r  r  r  r   r  r.   r   r   r   rl   r   rQ  r    )rR   r  r   r   r   r   #test_shared_memory_across_processes  s&   z5_TestSharedMemory.test_shared_memory_across_processesr+   z#not feasible in non-posix platformsc                 C   s   t j }|  |td}t|jj	t
j |td}| t tt t
j W d    n1 s9w   Y  |  d S r	  )r   managersSharedMemoryManagerr   ShareableListr  rD   r   r  r   r   ri  r  r.  r   r  )rR   smmslsl2r   r   r   4test_shared_memory_SharedMemoryServer_ignores_sigint  s   
zF_TestSharedMemory.test_shared_memory_SharedMemoryServer_ignores_sigintzresource_tracker is posix onlyc                 C   s0   d}t jjjd|fi t\}}}| | d S )Nzif 1:
            from multiprocessing.managers import SharedMemoryManager


            smm = SharedMemoryManager()
            smm.start()
            sl = smm.ShareableList(range(10))
            smm.shutdown()
        r  )r  r   r  r  r  r   r  r   r   r   >test_shared_memory_SharedMemoryManager_reuses_resource_tracker  s   	zP_TestSharedMemory.test_shared_memory_SharedMemoryManager_reuses_resource_trackerc                    s  t j  | t  jdd W d    n1 sw   Y      fddtddD } fddtdd	d
D }tj	|d j
jd}| t|d tj|d jd}| t|jd |d j}   tjdkr| t tj|d}W d    n1 sw   Y  t j }|	d}|jd	d}	|j
j}W d    n1 sw   Y  tjdkr| t tj	|d}
W d    d S 1 sw   Y  d S d S )Nr  r`  c                    s   g | ]	}  t|qS r   )r  r  r!  smm1r   r   r#    r  zS_TestSharedMemory.test_shared_memory_SharedMemoryManager_basics.<locals>.<listcomp>r|   r   c                    s   g | ]} j |d qS )r`  )r  )r"  r  r  r   r   r#    r  r        r   r.   r4   howdy)r   r  r  r  rG   r  r   r  r   r  shmr.   rl   r   r  rQ  r  r  r(  r  )rR   lollomdoppleganger_list0doppleganger_shm0	held_name
absent_shmsmm2r  r  	absent_slr   r  r   -test_shared_memory_SharedMemoryManager_basics  s6   





"z?_TestSharedMemory.test_shared_memory_SharedMemoryManager_basicsc              	   C   s  t g d}| |jj | |jjt| | tt|t| | 	t
 |d  W d    n1 s8w   Y  | 	t
 d|d< W d    n1 sQw   Y  |d}d|d< | ||d | |jd | t|d t 0 td | 	t |d W d    n1 sw   Y  | |d	d
 W d    n1 sw   Y  | |d d | |d d | t|d d|d
< | |d
 d d|d< | |d d | |jd | td d|d< W d    n1 sw   Y  | |d d d|d< | |d d | |d d | td d|d< W d    n	1 s6w   Y  | |d d | td d|d< W d    n	1 sYw   Y  | |d d t ( td | |dd | |dd | |dd W d    n	1 sw   Y  | d}t j||d}zD| |jj|jj | ||jj | t|t| | |j|j d|d< | |d d | |d d |j  W |j  n|j  w t j|jjd}| |jj|jj d|d< | |d d |j  |j  t  }z@| t|d | |jd | |dd | 	t |d  W d    n	1 sMw   Y  |j  W |j  d S |j  w ) N)r     HoWdYgX9vqr   NTrt  r  r   r   r  z8s8sdqxxxxxx?xxxxxxxx?qignore100r   r  r  Trt  somer  z8s8sdq8sxxxxxxx?qzexceeds available storagezfar too manyu   encodésrd   r  u	   encodéess	   123456789s   adiostest03_duplicater  M   rC   ip  r  any)r   r  r  r  r  r   r.   rz  r   r  
IndexError_get_packing_formatrl   r   r   warningscatch_warningssimplefilterrG   rh  r  r  ro  r  r   r    )rR   r  current_formatname_duplicatesl_copysl_tetheredempty_slr   r   r   'test_shared_memory_ShareableList_basics   s   












z9_TestSharedMemory.test_shared_memory_ShareableList_basicsc              	   C   s.  t tjd D ]}| j|d} tt d}| |jj tj	||d}t
|}| |tj | |d d | || d|d< | |d d d	|d
< | |d
 d	 tt d}| |jj tj	||d}| t|t| |j  |j  |j  W d    n1 sw   Y  qd S )Nrd   r  r   r  rC   r  changedr  newvaluer  i  )r  r  r  r  r   r  r  r  r  r  r  r   rl   assertIsNotr   r    )rR   r  r  serialized_sldeserialized_sl	larger_slserialized_larger_slr   r   r   )test_shared_memory_ShareableList_picklingq  s2   


z;_TestSharedMemory.test_shared_memory_ShareableList_picklingc              
   C   s   t tjd D ]J}| j|d: tt d}tj||d}|j  |j	  | 
t t| W d    n1 s=w   Y  W d    n1 sLw   Y  qd S )Nrd   r  r   r  )r  r  r  r  r   r  r  r  r    r  r  r  r  )rR   r  r  r  r   r   r   5test_shared_memory_ShareableList_pickling_dead_object  s   

zG_TestSharedMemory.test_shared_memory_ShareableList_pickling_dead_objectc              	   C   s   d}t jtjdd|gt jt jdu}|j   }|	  |
  t tj }d}t |k rWt| t|d d}z	tj|dd	}W n	 tyP   Y nw t |k s2td
tjdkr~td| d |j  }| d| W d    d S W d    d S 1 sw   Y  d S )NaX  if 1:
            import os, time, sys
            from multiprocessing import shared_memory

            # Create a shared_memory segment, and send the segment name
            sm = shared_memory.SharedMemory(create=True, size=10)
            sys.stdout.write(sm.name + '\n')
            sys.stdout.flush()
            time.sleep(100)
        -Er  rU  r2   r   r|   Fr  zJA SharedMemory segment was leaked after a process was abruptly terminated.r+   /r   z[resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown)
subprocessPopenr  
executablePIPErV  readlinestripdecoder   r6   rU   rV   r   r   r   minr   r  r  r   rD   r.   r,   
unregisterrW  r  r   )rR   r  r   r.   deadlinerY   r  r  r   r   r   4test_shared_memory_cleaned_after_process_termination  s>   


"zF_TestSharedMemory.test_shared_memory_cleaned_after_process_terminationN)r\   r]   r^   rs   r  r  r  r  rH   rq  r  r  r  r  r  rD   r.   r  r  r  r  r  r  r  r   r   r   r   r    s*    

p


qr  c                   @   s<   e Zd ZdZdd Zdd Zedd Zdd	 Zd
d Z	dS )_TestFinalizer~  c                 C   s   t j | _t j  d S r   )r
   _finalizer_registryr   registry_backuprD  rx   r   r   r   r`    r\  z_TestFinalize.setUpc                 C   s&   t   | tj tj| j d S r   )r  r  r   r
   r  updater  rx   r   r   r   rb    s   z_TestFinalize.tearDownc                 C   s&  G dd dt }| }tj||jdd ~t  | }tj||jdd}|  |  ~t  | }tj||jdd | }tj||jddd	 | }tj||jd
dd	 | }	tj|	|jddd	 | }
tj|
|jddd	 tjd |jddd	 tjd |jddd	 t  |  t	d d S )Nc                   @   r  )z)_TestFinalize._test_finalize.<locals>.FooNr
  r   r   r   r   r    r  r  )rh   r   )ri   )r   )d10rd   )rW   exitpriority)d01r   )d02)d03r   i)STOPi)
r  r
   Finalizer   r  r  _exit_functionr    rD   _exit)r   r  r  rh   ri   close_br   r  r  r  r  r   r   r   _test_finalize  s4   z_TestFinalize._test_finalizec                 C   s^   |   \}}| j| j|fd}d|_|  |  dd t|jdD }| |g d d S )Nr   Tc                 S   s   g | ]}|qS r   r   )r"  r  r   r   r   r#    rI  z/_TestFinalize.test_finalize.<locals>.<listcomp>r  )rh   ri   r  r  r  r  r   )	r   r   r   r   r   r   rv  r   rl   )rR   r  rt  r   r  r   r   r   test_finalize  s   z_TestFinalize.test_finalizec              	      s  dd G fdddt  dd fdd} fdd	}t }t }zKtd
 tddd tj|dtj|dg}t	
| td dW d    n1 sYw   Y  d urdW t| tj|  t  d S t| tj|  t  w )Nc                   S      d S r   r   r   r   r   r   cb  r  z,_TestFinalize.test_thread_safety.<locals>.cbc                       s   e Zd Z fddZdS )z-_TestFinalize.test_thread_safety.<locals>.Fooc                    s"   | | _ tj|  tddd d S )Nrd   r   )r  )r  r
   r  rc  randintrx   r#  r   r   rS     s   z6_TestFinalize.test_thread_safety.<locals>.Foo.__init__N)r\   r]   r^   rS   r   r%  r   r   r    r  r  Fc               
      sX   s*t t d  zt  W n ty% }  z|  W Y d } ~ nd } ~ ww rd S d S r5  )rU   r   rc  r
   _run_finalizersrQ  r  )rX  finishr   r   run_finalizers  s   z8_TestFinalize.test_thread_safety.<locals>.run_finalizersc               
      sj   i } s3z fddt dD | td< W n ty. } z||   W Y d }~nd }~ww rd S d S )Nc                    s   h | ]}  qS r   r   r!  )r  r   r   	<setcomp>0  ra  zL_TestFinalize.test_thread_safety.<locals>.make_finalizers.<locals>.<setcomp>r   r|   )r  rc  getrandbitsrQ  rD  )r  r   )r  rX  r'  r   r   make_finalizers)  s   $z9_TestFinalize.test_thread_safety.<locals>.make_finalizersgư>r|   r   r  T)r  r  getswitchintervalr  r{  setswitchintervalr|  r   rF  r   start_threadsrU   r   r  )rR   r(  r+  old_intervalold_thresholdrb   r   )r  r#  rX  r'  r   test_thread_safety  s6   








z _TestFinalize.test_thread_safetyN)
r\   r]   r^   rs   r`  rb  rn  r   r!  r1  r   r   r   r   r    s    
'r  c                   @   rM   )_TestImportStarc                 C   sh   dd l }tjtj}tj||d}| |}dd |D }dd |D }|d |	d |S )Nr   z*.pyc                 S   s(   g | ]}t jt j|d  d qS )rd   r   )rD   pathsplitextsplit)r"  r  r   r   r   r#  R  s   ( z4_TestImportStar.get_module_names.<locals>.<listcomp>c                 S   s   g | ]}d | qS )zmultiprocess.r   )r"  rh  r   r   r   r#  S  r:  zmultiprocess.__init__rC  )
globrD   r3  dirnamer   __file__r   escaperK  r  )rR   r6  folderpatternfilesmodulesr   r   r   get_module_namesM  s   


z _TestImportStar.get_module_namesc                 C   s   |   }tjdkr|d |d |d n|d ts%|d td u r.|d |D ]'}t| tj| }| t	|d| |j
D ]}| t	||d||f  qGq0d S )	Nr4   zmultiprocess.popen_forkzmultiprocess.popen_forkserverzmultiprocess.popen_spawn_posixzmultiprocess.popen_spawn_win32zmultiprocess.sharedctypes__all__z%r does not have attribute %r)r>  r  r(  rK  r  r?   r  r=  r   r   r?  )rR   r=  r.   modattrr   r   r   test_importX  s*   








z_TestImportStar.test_importN)r\   r]   r^   r>  rB  r   r   r   r   r2  K  s    r2  c                   @   s,   e Zd ZdZdd Zedd Zdd ZdS )	_TestLoggingr~  c                 C   sD   t  }|tj | |d u |d |d |t d S )Nzthis will not be printedznor will this)	r   
get_loggersetLevelr
   
SUBWARNINGr   debuginfo	LOG_LEVEL)rR   loggerr   r   r   test_enable_loggingz  s   

z _TestLogging.test_enable_loggingc                 C   s   t  }||  d S r   )r   rD  r   getEffectiveLevel)r   r  rJ  r   r   r   _test_level  s   z_TestLogging._test_levelc           	      C   s   d}d}t  }t }|j}t jdd\}}|| | j| j|fd}|	  | 
||  |  |  |tj || | j| j|fd}|	  | 
||  |  |  || |jtd d S )Nr  %   Fr   r   )level)r   rD  logging	getLoggerrO  r   rE  r   rM  r   rl   r   r   r    NOTSETrI  )	rR   LEVEL1LEVEL2rJ  root_logger
root_levelr  r  r   r   r   r   
test_level  s*   


z_TestLogging.test_levelN)r\   r]   r^   rs   rK  rn  rM  rW  r   r   r   r   rC  v  s    
rC  c                   @   s6   e Zd ZdZedd Zeee	dddd Z
dS )	_TestPollEintrr~  c                 C   s   t d t|tj d S r5  )rU   r   rD   r   r   SIGUSR1)r   r   r   r   r   _killer  s   
z_TestPollEintr._killerrY  requires SIGUSR1c              
      s   dg  fdd}t  }ttj|}zA| j| j|fd}|  z| jtjdd}|  |	  W |	  n|	  w | 
 d  | |jd W ttj| d S ttj| w )NFc                     s   d d< d S )NTr   r   r   
got_signalr   r   record  r   z._TestPollEintr.test_poll_eintr.<locals>.recordr   )r   r   )rD   r   r   rY  r   rZ  r   rU   r   r   r   rl   r   )rR   r^  r   
oldhandlerkillerr   r   r\  r   test_poll_eintr  s   
"z_TestPollEintr.test_poll_eintrN)r\   r]   r^   rs   rn  rZ  rH   ro  r   r   ra  r   r   r   r   rX    s    
rX  c                   @   s    e Zd Zeeddd ZdS )TestInvalidHandleskipped on Windowsc              	   C   s^   t jd}zz|  W n ttfy   Y nw W d |_nd |_w | ttft jjd d S )NiMrC   )r   r"  
Connectionr   rG   r  _handler  r  r   r   r   test_invalid_handles  s   
z&TestInvalidHandle.test_invalid_handlesN)r\   r]   r^   rH   rq  WIN32rf  r   r   r   r   rb    s    
rb  c                   @   rM   )	OtherTestc                 C   ,   G dd dt }| tjtjj| d d S )Nc                   @   rM   )zFOtherTest.test_deliver_challenge_auth_failure.<locals>._FakeConnectionc                 S   r2  )N   something bogusr   rR   r  r   r   r   r    r  zQOtherTest.test_deliver_challenge_auth_failure.<locals>._FakeConnection.recv_bytesc                 S   r"  r   r   rR   r  r   r   r   r    r  zQOtherTest.test_deliver_challenge_auth_failure.<locals>._FakeConnection.send_bytesN)r\   r]   r^   r  r  r   r   r   r   _FakeConnection  r[  rm     abc)r  r  r   AuthenticationErrorr"  deliver_challengerR   rm  r   r   r   #test_deliver_challenge_auth_failure  s
   z-OtherTest.test_deliver_challenge_auth_failurec                 C   ri  )Nc                   @   r  )zEOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnectionc                 S   
   d| _ d S r%  )ro  rx   r   r   r   rS     r   zNOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnection.__init__c                 S   s2   |  j d7  _ | j dkrtjjS | j dkrdS dS )Nrd   r   rj  r3  )ro  r   r"  	CHALLENGErk  r   r   r   r    s   

zPOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnection.recv_bytesc                 S   r"  r   r   rl  r   r   r   r    r  zPOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnection.send_bytesN)r\   r]   r^   rS   r  r  r   r   r   r   rm    s    rm  rn  )r  r  r   ro  r"  answer_challengerq  r   r   r   "test_answer_challenge_auth_failure  s
   z,OtherTest.test_answer_challenge_auth_failureN)r\   r]   r^   rr  rv  r   r   r   r   rh    s    
rh  c                 C   s   |  j d7  _ d S rc   )r  )nsr   r   r   initializer  r1   rx  c                   @   rr  )
TestInitializersc                 C   s"   t  | _| j | _d| j_d S r%  )r   Managermgrr  rw  r  rx   r   r   r   r`    s   
zTestInitializers.setUpc                 C   s   | j   | j   d S r   )r{  r  r   rx   r   r   r   rb    r  zTestInitializers.tearDownc                 C   sN   t j }| t|jd |t| jf | | jj	d |
  |  d S rc   )r   r  SyncManagerr  	TypeErrorr   rx  rw  rl   r  r  r   )rR   rh  r   r   r   test_manager_initializer   s   
z)TestInitializers.test_manager_initializerc                 C   sH   | j ttjdd tdt| jf}|  |  | | jj	d d S )Nrd   )rx  )
r  r}  r   r  rx  rw  r    r   rl   r  r   r   r   r   test_pool_initializer(  s
   z&TestInitializers.test_pool_initializerN)r\   r]   r^   r`  rb  r~  r  r   r   r   r   ry    s
    ry  c                 C   s*   z	| j dd}W d S  tjy   Y d S w )NF)block)r   r  r  )r~   itemr   r   r   _this_sub_process4  s
   r  c                  C   s2   t  } t jt| fd}d|_|  |  d S r   )r   r   r   r  r   r   r   )r#   subProcr   r   r   _test_process:  s
   r  c                 C   s   | |  S r   r   r  r   r   r   _afuncA  rr   r  c                  C   s0   t jdd} | tg d}|   |   d S )Nr  r~  )rd   r   r  r  r|   r  r  )r   r  r  r  r    r   )r  r  r   r   r   pool_in_processD  s   r  c                   @   s0   e Zd Zdd Zedd Zdd Zdd Zd	S )

_file_likec                 C   rO   r   )	_delegate_pid)rR   delegater   r   r   rS   K  rT   z_file_like.__init__c                 C   s$   t  }|| jkr|| _g | _| jS r   )rD   r   r  _cacherR  r   r   r   cacheO  s
   
z_file_like.cachec                 C   s   | j | d S r   )r  r  rl  r   r   r   r  X  rZ  z_file_like.writec                 C   s   | j d| j g | _d S )Nr  )r  r  r   r  r  rx   r   r   r   flush[  s   
z_file_like.flushN)r\   r]   r^   rS   propertyr  r  r  r   r   r   r   r  J  s    
r  c                   @   r  )TestStdinBadfiledescriptorc                 C       t jtd}|  |  d S Nr   )r   r   r  r   r   )rR   rI  r   r   r   test_queue_in_processa     z0TestStdinBadfiledescriptor.test_queue_in_processc                 C   r  r  )r   r   r  r   r   r   r   r   r   test_pool_in_processf  r  z/TestStdinBadfiledescriptor.test_pool_in_processc                    sJ   t  }t|  d tj fddd}   | dks#J d S )Nr  c                      s      S r   )r  r   fliker   r   r  o  r  z:TestStdinBadfiledescriptor.test_flushing.<locals>.<lambda>r   )rM  rN  r  r  r   r   r  rW  )rR   siorI  r   r  r   test_flushingk  s   
z(TestStdinBadfiledescriptor.test_flushingN)r\   r]   r^   r  r  r  r   r   r   r   r  _  s    r  c                   @   sl   e Zd Zedd ZdddZedd Zddd	Zd
d Zdd Z	dd Z
edd Zdd Zdd ZdS )TestWaitc                 C   sB   t dD ]}|rtt d  ||t f q|  d S )Nr   r2   )r  rU   r   rc  r   rD   r   r    )r   r  slowr  r   r   r   _child_test_waitv  s
   zTestWait._child_test_waitFc              	      s  ddl m} g }g  g }tdD ]/}tjdd\}}tj| j||fd}d|_|  |	  |
|  
| | |j q|ri||D ] }z| }	W n ty`   || |	  Y qFw |
|	 qF|sB|  t fdd	td
D }
| ||
 d S )Nr   r5   r  Fr   r   Tc                 3   s$    | ]} D ]}||j fV  qqd S r   r  )r"  r  r   r,  r   r   r    s   " z%TestWait.test_wait.<locals>.<genexpr>r   )multiprocess.connectionr6   r  r   r   r   r  r   r   r    r  r  r   r   r  rK  rk  r  rl   )rR   r  r6   readersmessagesr  rM  r  r   r  r  r   r  r   	test_wait~  s4   



zTestWait.test_waitc                 C   sV   t   }|| tdD ]}|rtt d  |d| d q|  d S )Nr   r2   %s
rK  )	rD  r  r  rU   r   rc  rI  r   r    )r   r   r  r   r  r   r   r   _child_test_wait_socket  s   
z TestWait._child_test_wait_socketc                 C   s2  ddl m} ttjdf}| }g }g }i }tdD ]}tj	| j
||fd}	d|	_|	  ||	 | |	j qtdD ]}| \}
}||
 g ||
< q?|  |rx||D ]}
|
d}|sn||
 |
  q[||
 | q[|sWddd	 td
D d}| D ]}| d|| qd S )Nr   r5   r  r   Tr  r  c                 s   s    | ]}d | V  qdS )r  Nr   r!  r   r   r   r    r  z,TestWait.test_wait_socket.<locals>.<genexpr>r   rK  r3  )r  r6   rD  rE  r   r  rF  r  r   r   r  r   r   r  r  r   r(  r    r   rK  r   r  rl   )rR   r  r6   r  r  r  r,  dicr  r   rM  rD  r  r  vr   r   r   test_wait_socket  s>   





	zTestWait.test_wait_socketc                 C      |  d d S r  )r  rx   r   r   r   test_wait_slow  rX  zTestWait.test_wait_slowc                 C   r  r  )r  rx   r   r   r   test_wait_socket_slow  rX  zTestWait.test_wait_socket_slowc                 C   s   ddl m} d}t \}}t }|||g|}t | }| |g  | ||d  | ||d  |	d  t }|||gd}t | }| ||g | |d d S )Nr   r5   r|   r   r>  rC  皙?)
r  r6   r   r   rU   rV   rl   rJ  r^  r   )rR   r6   r  rh   ri   r   rn   r  r   r   r   test_wait_timeout  s   
zTestWait.test_wait_timeoutc                 C   s   |   t| d S r   )r  rU   r   )r   r  periodr   r   r   signal_and_sleep  rn  zTestWait.signal_and_sleepc                 C   s  ddl m} d}dd }td}t \}}tj| j||fd}|  | |j	t
 | |jdd t }|||j	|g|d }	t | }
| |	|j	g | |
|d	  | |
|d	  |d  t }|||j	|gd}	t | }
| ||	||j	|g | |
d
 |d  t }|||j	|gd}	t | }
| ||	|||j	|g | |
d
 |  |  d S )Nr   r5   r  c                 S   s   t | dd dS )Nc                 S   s   t | S r   )r  r  r   r   r   r    r  z>TestWait.test_wait_integer.<locals>.<lambda>.<locals>.<lambda>)rq  )r  )r  r   r   r   r    rI  z,TestWait.test_wait_integer.<locals>.<lambda>r   rC  r&   r   r  )r  r6   r   r  r   r   r  r   r   r  r   r   r  rU   rV   rl   rJ  r^  r   r   r   )rR   r6   r  sorted_r  rh   ri   r   r   rn   r  r   r   r   test_wait_integer  s>   


zTestWait.test_wait_integerc                 C   sf   ddl m} t \}}t }||gdd}t | }| |g  | |d |  |  d S )Nr   r5   rC   r&   rd   )	r  r6   r   r   rU   rV   rl   rJ  r    )rR   r6   rh   ri   rY   rn   r   r   r   test_neg_timeout  s   zTestWait.test_neg_timeoutNr  )r\   r]   r^   rn  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  t  s    



	#
+r  c                   @   s4   e Zd Zeeddd Zeeddd ZdS )TestInvalidFamilyrc  c                 C   <   |  t tjd W d    d S 1 sw   Y  d S )Nz\\.\testr  rG   r   r"  r$  rx   r   r   r   test_invalid_family'     "z%TestInvalidFamily.test_invalid_familyz skipped on non-Windows platformsc                 C   r  )Nz/var/test.piper  rx   r   r   r   test_invalid_family_win32,  r  z+TestInvalidFamily.test_invalid_family_win32N)	r\   r]   r^   rH   rq  rg  r  ro  r  r   r   r   r   r  %  s
    


r  c                   @   s,   e Zd Zedd Zedd Zdd ZdS )	TestFlagsc                 C   s   | ttj d S r   )r   r  r  flagsr   r  r   r   r   run_in_grandchild6  r  zTestFlags.run_in_grandchildc                 C   sr   dd l }tjdd\}}tj| j|fd}|  | }|  |  |  t	t
j|f}t|| d S )Nr   Fr   r   )jsonr   r   r   r  r   r   r   r    r  r  r  printr  )r   r  rM  r  r   grandchild_flagsr  r   r   r   run_in_child:  s   zTestFlags.run_in_childc                 C   sH   dd l }d}ttjdddd|g}||d\}}| || d S )Nr   zBfrom multiprocess.tests import TestFlags; TestFlags.run_in_child()r  z-Sz-Or  rK  )r  r  check_outputr  r  r  r  rl   )rR   r  progr  child_flagsr  r   r   r   _test_flagsG  s   zTestFlags._test_flagsN)r\   r]   r^   rn  r  r  r  r   r   r   r   r  5  s    

r  c                   @   r1  )TestTimeoutsc                 C   s>   t d |d |  tj|}|d |  d S )Nrd   r  r  )rU   r   r   r    r   r"  r'  )r   childr   r  r   r   r   _test_timeoutV  s   


zTestTimeouts._test_timeoutc              	   C   s   t  }zSt d tjdd\}}tjjdd}tj| j||j	fd}|
  |  | | d |  | }| | d |  |  t| W t | d S t | w )	Nr2   Tr   AF_INETr   r   r  r  )rD  getdefaulttimeoutsetdefaulttimeoutr   r   r"  r$  r   r  r   r   r    rl   r   r(  r*   )rR   old_timeoutparentr  r  r   r  r   r   r   r  _  s$   

zTestTimeouts.test_timeoutN)r\   r]   r^   rn  r  r  r   r   r   r   r  U  s    
r  c                   @   ry   )TestNoForkBombc                 C   s   t  }tjtjtd}|dkr,tjj	
||\}}}| |d | d| d S tjj	j||fi t\}}}| | d | |d d S )Nzmp_fork_bomb.pyr4  r3  s   RuntimeErrors   123)r   r&  rD   r3  r   r7  r8  r  r   r  assert_python_failurerl   r   r  r  r  )rR   r)  r.   r  r  r  r   r   r   test_noforkbombx  s   zTestNoForkBomb.test_noforkbombN)r\   r]   r^   r  r   r   r   r   r  w  r   r  c                   @   r1  )TestForkAwareThreadLockc                 C   sV   |dkrt j| j|d |fd}|  |  t| n|ttj	 |  d S )Nrd   r   )
r   r   r  r   r    r*   r   r   r
   _afterfork_registry)r   r  r  r   r   r   r   r    s   
zTestForkAwareThreadLock.childc                 C   sd   t d\}}t }ttj}t j| jd|fd}|  |	  |
 }t| | || d S )NFr|   r   )r   r   r
   ForkAwareThreadLockr   r  r   r  r   r    r   r*   assertLessEqual)rR   rM  r  r  old_sizer   new_sizer   r   r   r    s   
z!TestForkAwareThreadLock.test_lockN)r\   r]   r^   rn  r  r  r   r   r   r   r    s    

r  c                   @   s0   e Zd Zdd Zdd Zedd Zdd Zd	S )
TestCloseFdsc                 C   s\   t rt  S t  }g }|dk r"|| t|}|dk s|D ]}t| q$|S )Nr  )rg  rD  detachr  rD   dupr    )rR   r  to_closer  r   r   r   get_high_socket_fd  s   

zTestCloseFds.get_high_socket_fdc                 C   s.   t rtjtjtj|d  d S t| d S )N)r  )rg  rD  r  SOCK_STREAMr    rD   )rR   r  r   r   r   r      s   zTestCloseFds.closec              
   C   s^   zt |t jt j}W n ty# } z|| W Y d }~d S d }~ww |  |d  d S r   )rD  fromfdr  r  rQ  r   r    )r   r  r  r   r   r   r   r   _test_closefds  s   zTestCloseFds._test_closefdsc              	   C   s   t stdt \}}|  }z)tj| j||fd}|  |	  |
 }t| W | 	| |	  |	  n| 	| |	  |	  w t dkrW| |d  d S d}| |t | |jtjkpk|j|k| d S )Nzrequires fd picklingr   r4  i6'  )r  rH   rI   r   r   r  r   r  r   r    r   r*   r&  r  r   r  r   r  r  winerror)rR   r  r  r  r   r   WSAENOTSOCKr   r   r   test_closefd  s2   






zTestCloseFds.test_closefdN)r\   r]   r^   r  r    rn  r  r  r   r   r   r   r    s    
	r  c                   @   sf   e Zd ZeejejZedd Z	e
eedddd Zedd Ze
eeddd	d
 ZdS )TestIgnoreEINTRc                 C   sF   dd }t  t j| |d | }|| |d| j  d S )Nc                 S   r"  r   r   rf  framer   r   r   r     r  z-TestIgnoreEINTR._test_ignore.<locals>.handlerready   x)r   rY  r   r   r  CONN_MAX_SIZE)r   r  r   r  r   r   r   _test_ignore  s   

zTestIgnoreEINTR._test_ignorerY  r[  c                 C   s   t  \}}zct j| j|fd}d|_|  |  | | d t	
d t|jtj t	
d |d | | d t	
d t|jtj | | d| j  t	
d |  W |  d S |  w )Nr   Tr  r2   i  r  )r   r   r   r  r   r   r    rl   r   rU   r   rD   r   r   r   rY  r   r  r  r   r  r   r   r   test_ignore  s(   





zTestIgnoreEINTR.test_ignorec                 C   sd   dd }t  t j| tj }||j | }|d W d    d S 1 s+w   Y  d S )Nc                 S   r"  r   r   r  r   r   r   r     r  z6TestIgnoreEINTR._test_ignore_listener.<locals>.handlerwelcome)r   rY  r   r"  r$  r   r   r(  )r   r  r   r  rh   r   r   r   _test_ignore_listener  s   "z%TestIgnoreEINTR._test_ignore_listenerc                 C   s   t  \}}zCt j| j|fd}d|_|  |  | }t	d t
|jtj t	d t j|}| | d |  W |  d S |  w )Nr   Tr2   r  )r   r   r   r  r   r   r    r   rU   r   rD   r   r   r   rY  r"  r'  rl   r   )rR   r  rt  r   r   r)  r   r   r   test_ignore_listener  s    


z$TestIgnoreEINTR.test_ignore_listenerN)r\   r]   r^   maxr   PIPE_MAX_SIZESOCK_MAX_SIZEr  rn  r  rH   ro  r   r   r  r  r  r   r   r   r   r    s    
	

	r  c                   @   s@   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dS )TestStartMethodc                 C   s   | t  d S r   )r   r   r&  r  r   r   r   _check_context-     zTestStartMethod._check_contextc                 C   s^   |j dd\}}|j| j|fd}|  |  | }|  |  | ||  d S )NFr   r   )	r   r   r  r   r    r   r   rl   r&  )rR   r  rM  r  r   child_methodr   r   r   check_context1  s   zTestStartMethod.check_contextc              	   C   sz   dD ]8}zt |}W n	 ty   Y qw | | | | | | | t|jd | t|jd  | | qd S )Nr4  r  r_  r  )	r   r  rG   rl   r&  r  r  set_start_methodr  )rR   methodr  r   r   r   rN  ;  s   zTestStartMethod.test_contextc              
   C   s   t t d}t  }zWdD ]K}z	t j|dd W n	 ty"   Y qw | t  | t  }| | | | t	|j
 | | |jj
 | | t  |d7 }qW t j|dd nt j|dd w | |d d S )Nr   r  Tforcerd   )r   set_forkserver_preloadPRELOADr&  r  rG   rl   r  r   r   r\   lower
startswithr   r  r  )rR   ro  
old_methodr  r  r   r   r   test_set_getG  s,   


 zTestStartMethod.test_set_getc                 C   s^   t  }tjdkr| |dg d S | |ddgkp+|ddgkp+|g dkp+|g dk d S )Nr4   r  r4  r  )r  r4  r_  )r   get_all_start_methodsr  r(  rl   r   )rR   methodsr   r   r   test_get_all]  s   



zTestStartMethod.test_get_allc                 C   s   t  dkr| d tjtjtd}tj	j
j|fi t\}}}| }| }| dks6|dkrEt| t| | d d S d S )Nr_  z*test only relevant for 'forkserver' methodzmp_preload.pyokr  z(failed spawning forkserver or grandchild)r   r&  r   rD   r3  r   r7  r8  r  r   r  r  r  r  r  r  r  )rR   r.   r  r  r  r   r   r   test_preload_resourcesg  s   
z&TestStartMethod.test_preload_resourcesN)
r\   r]   r^   rn  r  r  rN  r  r  r   r   r   r   r   r  ,  s    


r  r  c                   @   sP   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedd Z	dd Z
dd ZdS )TestResourceTrackerc                 C   s  d}t jD ]}| j|d |dkr	 W d    qt \}}tjtjdd|j	||dg|gtj
d}t| t|dd	d
}|  d}|  d}W d    n1 s]w   Y  t|| |  |  t tj }	t |	k rtd zt|| W n ty }
 z| |
jtjtjf W Y d }
~
nd }
~
ww t |	k s|td| d|j d}|j  d	|}|  || |  |d|  W d    n1 sw   Y  qd S )Na"  if 1:
            import time, os, tempfile
            import multiprocess as mp
            from multiprocess import resource_tracker
            from multiprocess.shared_memory import SharedMemory

            mp.set_start_method("spawn")
            rand = tempfile._RandomNameSequence()


            def create_and_register_resource(rtype):
                if rtype == "semaphore":
                    lock = mp.Lock()
                    return lock, lock._semlock.name
                elif rtype == "shared_memory":
                    sm = SharedMemory(create=True, size=10)
                    return sm, sm._name
                else:
                    raise ValueError(
                        "Resource type {{}} not understood".format(rtype))


            resource1, rname1 = create_and_register_resource("{rtype}")
            resource2, rname2 = create_and_register_resource("{rtype}")

            os.write({w}, rname1.encode("ascii") + b"\n")
            os.write({w}, rname2.encode("ascii") + b"\n")

            time.sleep(10)
        )r/   noopr  r  )r  r/   )pass_fdsrW  r  T)r  rK  r>  zA z= resource was leaked after a process was abruptly terminated.r  z8resource_tracker: There appear to be 2 leaked {} objectszresource_tracker: %r: \[Errno)!r,   r-   r  rD   piper  r  r  r  r   r	  r    r  r
  r  r  r0   r   r6   rU   rV   r   r   r   r  r   r  ENOENTEINVALr   rW  r  assertRegex)rR   r  r/   rM  r  r   r  name1name2r  r   r  r  r   r   r   _test_resource_trackerx  s^   






z*TestResourceTracker._test_resource_trackerc           
      C   sr  ddl m} |j}|d urt|tj tj|tj d t	
  t	d |  W d    n1 s5w   Y  |j}t|| td td}t	j
dd\}t	d	 | }|  |  t|}~t  | |  |r| t|d
 |d }	| t|	jt | dt|	j v  n| t|d W d    d S W d    d S 1 sw   Y  d S )Nr   _resource_tracker)r   r  r  r  T)r^  alwaysrd   zresource_tracker: process died)!multiprocess.resource_trackerr  r  rD   r   r   r   r   wait_processr  r  r  rd  rU   r   r   r  r  r  r  r  r  r  r  r   rl   r   r   
issubclasscategoryUserWarningrz  message)
rR   rf  
should_dier  r   r  all_warnr  r  the_warnr   r   r   check_resource_tracker_death  sB   






"z0TestResourceTracker.check_resource_tracker_deathc                 C      |  tjd d S r  )r  r   ri  rx   r   r   r   test_resource_tracker_sigint  r  z0TestResourceTracker.test_resource_tracker_sigintc                 C   r  r  )r  r   r   rx   r   r   r   test_resource_tracker_sigterm  r  z1TestResourceTracker.test_resource_tracker_sigtermc                 C   r  r  )r  r   r   rx   r   r   r   test_resource_tracker_sigkill  r  z1TestResourceTracker.test_resource_tracker_sigkillc                 C   s<   ddl m} |  |jd |fv }|| M }| | d S )Nr   r  )r  r  rd  r  _check_aliver   )r  r   r  reusedr   r   r   _is_resource_tracker_reused  s
   z/TestResourceTracker._is_resource_tracker_reusedc                 C   st   ddl m} |  |j}tjdd\}}tj| j||fd}|  |	 }|
  |  |  | | d S )Nr   r  Fr   r   )r  r  rd  r  r   r   r   r  r   r   r   r    r   )rR   r  r   rM  r  r   is_resource_tracker_reusedr   r   r   test_resource_tracker_reused  s   z0TestResourceTracker.test_resource_tracker_reusedc                 C   sP   d}ddt |  }| t t|| W d    d S 1 s!w   Y  d S )Nr   rh   r  )r   r  rG   r,   register)rR   r/   too_long_name_resourcer   r   r   test_too_long_name_resource  s
   "z/TestResourceTracker.test_too_long_name_resourceN)r\   r]   r^   r
  r  r  r  r  r  r  r   r#  r   r   r   r   r  t  s    J%
	r  c                   @   s8   e Zd Zedd Zdd Zdd Zejj	dd Z
d	S )
TestSimpleQueuec                 C   s>   |   z||  ||  W |  d S |  w r   )r6   r}   r  r  r  r   r   r   _test_empty  s
   zTestSimpleQueue._test_emptyc                 C   s   t  }t  }t  }t j| j|||fd}d|_|  | |  |	  |
  | |  | | d | | d | |  |  d S )Nr   TF)r   SimpleQueuer   r   r%  r   r   r   r  r  r6   r   rl   r   r   )rR   r#   r  r  rI  r   r   r   
test_empty$  s"   zTestSimpleQueue.test_emptyc                 C   s   t  }|  |  d S r   )r   r&  r    rR   r#   r   r   r   r  <  s   zTestSimpleQueue.test_closec                 C   s0   t  }|  | |jj | |jj d S r   )r   r&  r    r   _readerr  _writerr(  r   r   r   test_closedC  s   zTestSimpleQueue.test_closedN)r\   r]   r^   rn  r%  r'  r  r  r   cpython_onlyr+  r   r   r   r   r$    s    
	r$  c                   @   ry   )TestPoolNotLeakOnFailurec                    s   dg  G  fddd}|  td tjjdtjj|dd}|  |	  W d    n1 s4w   Y  | 
tdd	  D  d S )
Nr  c                       s<   e Zd Z fddZfddZdd Zdd Zd	d
 ZdS )zRTestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcessc                    s    d| _ d | _d | _ |  d S )NzFake Process)r.   r   r!  r  )rR   r   )forked_processesr   r   rS   T  s   z[TestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.__init__c                    s"    dkrt d d8  d| _d S )Nr   Manually induced OSErrorrd   rJ  )r  r!  rx   )will_fail_inr   r   r   Z  s   
zXTestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.startc                 S   rs  )Nstoppingr   rx   r   r   r   r   a  r   z\TestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.terminatec                 S   s   | j dkr
d| _ d S d S )Nr1  stoppedr   rx   r   r   r   r   d  s   

zWTestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.joinc                 S   s   | j dkp	| j dkS )NrJ  r1  r   rx   r   r   r   r   h  s   z[TestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.is_aliveN)r\   r]   r^   rS   r   r   r   r   r   r.  r0  r   r   FailingForkProcessS  s    r4  r/  r|   )r   )contextc                 s   r  r   r  )r"  r)   r   r   r   r  q  r  zITestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.<genexpr>)r  r  r   r  r  rH   r  	MagicMockr    r   r   r  )rR   r4  r   r   r3  r   test_release_unused_processesM  s   

z6TestPoolNotLeakOnFailure.test_release_unused_processesN)r\   r]   r^   r7  r   r   r   r   r-  K  s    r-  c                   @   sd  e Zd ZdZejjZdd Zdd Z	e
dd ZeZdd	 Zd
d Ze
dd Zdd Ze
dd ZdHddZe
dd ZdHddZe
dd ZdIddZdd Ze
d d! Zd"d# Ze
d$d% Zd&d' Ze
d(d) Zd*d+ Ze
d,d- ZdJd/d0Zd1d2 Z e
d3d4 Z!d5d6 Z"e
d7d8 Z#d9d: Z$e
d;d< Z%d=d> Z&e
d?d@ Z'dAdB Z(e
dCdD Z)dEdF Z*dGS )KTestSyncManagerTypesa}  Test all the types which can be shared between a parent and a
    child process by using a manager which acts as an intermediary
    between them.

    In the following unit-tests the base type is created in the parent
    process, the @classmethod represents the worker process and the
    shared object is readable and editable between the two.

    # The child.
    @classmethod
    def _test_list(cls, obj):
        assert obj[0] == 5
        assert obj.append(6)

    # The parent.
    def test_list(self):
        o = self.manager.list()
        o.append(5)
        self.run_worker(self._test_list, o)
        assert o[1] == 6
    c                 C   s   |   | _| j  d | _d S r   )manager_classra   r   rI  rx   r   r   r   r`    s   


zTestSyncManagerTypes.setUpc                 C   sB   | j d ur| j  r| j   | j   | j  d | _d | _ d S r   )rI  r   r   r   ra   r  rx   r   r   r   rb    s   



zTestSyncManagerTypes.tearDownc                 C   s   t   d S r   )r   reap_childrenr   r   r   r   r       zTestSyncManagerTypes.setUpClassc                 C   s   t | j t }d}tt dkrDt| |d9 }t | }|dkr:dtj	_
t	dt  d| d d S tt dksd S d S )	Nr   rd   r   r  Tmultiprocess.Manager still has  active children after  seconds)r*   rI  rU   rV   r   r   r   r   r  r   environment_alteredprint_warning)rR   
start_timerY   r(  r   r   r   wait_proc_exit  s    


z#TestSyncManagerTypes.wait_proc_exitc                 C   s@   t j||fd| _d| j_| j  |   | | jjd d S )Nr   Tr   )r   r   rI  r   r   rB  rl   r   )rR   workerr  r   r   r   
run_worker  s
   
zTestSyncManagerTypes.run_workerc                 C   s*   |  sJ |  |  |d d S Nr$  )rH  r6   rD  r   r  r   r   r   r3    s   z TestSyncManagerTypes._test_eventc                 C   s:   | j  }|  | | j| | rJ |d d S rE  )ra   r   r  rD  r3  rH  r6   rR   rb  r   r   r   r4    s
   
zTestSyncManagerTypes.test_eventc                 C      |   d S r   r  rF  r   r   r   
_test_lock  r;  zTestSyncManagerTypes._test_lockr  c                 C   s6   t | j| }| | j| |  | t|j d S r   )rX  ra   rD  rJ  r  r  r   rR   lnamerb  r   r   r   r    s   zTestSyncManagerTypes.test_lockc                 C      |   |  d S r   r  r  rF  r   r   r   _test_rlock     z TestSyncManagerTypes._test_rlockc                 C   s    t | j| }| | j| d S r   )rX  ra   rD  rO  rK  r   r   r   r       zTestSyncManagerTypes.test_rlockc                 C   rH  r   rI  rF  r   r   r   r    r;  z$TestSyncManagerTypes._test_semaphorer  c                 C   s(   t | j| }| | j| |  d S r   )rX  ra   rD  r  r  )rR   snamerb  r   r   r   r     s   z#TestSyncManagerTypes.test_semaphorec                 C   r  )Nr  )rR  )r   rx   r   r   r   r    rZ  z+TestSyncManagerTypes.test_bounded_semaphorec                 C   rM  r   rN  rF  r   r   r   _test_condition  rP  z$TestSyncManagerTypes._test_conditionc                 C   s   | j  }| | j| d S r   )ra   r  rD  rS  rG  r   r   r   test_condition  s   
z#TestSyncManagerTypes.test_conditionc                 C   s   |j dksJ |  d S r{   )rd  rz  rF  r   r   r   _test_barrier  r3  z"TestSyncManagerTypes._test_barrierc                 C   s   | j d}| | j| d S r{   )ra   r]  rD  rU  rG  r   r   r   rk    s   z!TestSyncManagerTypes.test_barrierc                 C   s*   |	 W d    d S 1 sw   Y  d S r   r   rF  r   r   r   
_test_pool  s   "zTestSyncManagerTypes._test_poolc                 C   s    | j jdd}| | j| d S )Nr  r~  )ra   r  rD  rV  rG  r   r   r   	test_pool  rQ  zTestSyncManagerTypes.test_poolc                 C   sd   |  dksJ | sJ | rJ | dksJ | r"J | dks*J | s0J d S Nr   r|   r  )r  r  r  r   rF  r   r   r   _test_queue  s   z TestSyncManagerTypes._test_queuer   c                 C   sN   t | j|d}|d |d | | j| | sJ | r%J d S rX  )rX  ra   r}   rD  rY  r  r  )rR   qnamerb  r   r   r   
test_queue  s   

zTestSyncManagerTypes.test_queuec                 C   r  )Nr  )r[  rx   r   r   r   test_joinable_queue  rX  z(TestSyncManagerTypes.test_joinable_queuec                 C   st   |d dksJ | ddksJ |ddksJ |  |  |D ]}q$t|dks/J |ddks8J d S )Nr   r|   rd   )ro  rh  rk  reverser   r  )r   r  r  r   r   r   
_test_list  s   zTestSyncManagerTypes._test_listc                 C   s>   | j  }|d | | j| |rJ | t|d d S )Nr|   r   )ra   r   r  rD  r^  rl   r   rG  r   r   r   r  #  s
   

zTestSyncManagerTypes.test_listc                 C   s   t |dksJ |d dksJ |ddksJ t| dgks$J t| dgks/J t| dgks:J | ddiksDJ | dksLJ d S )Nrd   r  r|   )r  r|   )r   r   r   rL  r  r  r   popitemrF  r   r   r   
_test_dict*  s   zTestSyncManagerTypes._test_dictc                 C   s<   | j  }d|d< | | j| |rJ | t|d d S )Nr|   r  r   )ra   r  rD  r`  rl   r   rG  r   r   r   r  5  s
   
zTestSyncManagerTypes.test_dictc                 C   s,   |j dksJ | dksJ |d d S )Nrd   r   )rm   r   r  rF  r   r   r   _test_value<  s   z TestSyncManagerTypes._test_valuec                 C   s>   | j dd}| | j| | |jd | | d d S )Nr  rd   r   )ra   r   rD  ra  rl   rm   r   rG  r   r   r   r  B  s   zTestSyncManagerTypes.test_valuec                 C   sH   |d dksJ |d dksJ t |dksJ t|ddgks"J d S )Nr   rd   r   )r   r   rF  r   r   r   _test_arrayH  s   z TestSyncManagerTypes._test_arrayc                 C   s$   | j dddg}| | j| d S )Nr  r   rd   )ra   r  rD  rb  rG  r   r   r   r  O  s   zTestSyncManagerTypes.test_arrayc                 C   s    |j dksJ |jdksJ d S rB  r  rF  r   r   r   _test_namespaceS  s   z$TestSyncManagerTypes._test_namespacec                 C   s(   | j  }d|_d|_| | j| d S rB  )ra   r  r  r  rD  rc  rG  r   r   r   r  X  s   
z#TestSyncManagerTypes.test_namespaceNr  )r  )r   )+r\   r]   r^   r  r   r  r|  r9  r`  rb  rn  r  r  rB  rD  r3  r4  rJ  r  rO  r  r  r   r  rS  rT  rU  rk  rV  rW  rY  r[  r\  r^  r  r`  r  ra  r  rb  r  rc  r  r   r   r   r   r8  t  sf    












	





r8  c                   @   s&   e Zd Zeejdkddd ZdS )TestNamedResource
SemLock subclassc                 C   s~   t j}| t j| t|ddd}|td W d    n1 s$w   Y  tj	j
j|fi t\}}}| |d d S )Nr  r  r  aX                  import multiprocess as mp

                ctx = mp.get_context('spawn')

                global_resource = ctx.Semaphore()

                def submain(): pass

                if __name__ == '__main__':
                    p = ctx.Process(target=submain)
                    p.start()
                    p.join()
            r3  )r   r  r  r  r  r  textwrapdedentr  r   r  r  r  rl   )rR   r  r  r  r  r  r   r   r    test_global_named_resource_spawn`  s   z2TestNamedResource.test_global_named_resource_spawnN)r\   r]   r^   rH   rq  r  
hexversionri  r   r   r   r   rd  _  s    rd  c                   @   ry   )MiscTestCasec                 C   s   t j| ttjg dd d S )N)SUBDEBUGrF  licensecitation)extranot_exported)r   check__all__r   r?  rx   r   r   r   test__all__~  s   
zMiscTestCase.test__all__N)r\   r]   r^   rr  r   r   r   r   rk  }  r   rk  c                   @   s$   e Zd Zedd Zedd ZdS )	BaseMixinc                 C   s   t jj tj f| _d S r   )r   r)   	_danglingr   r   danglingr   r   r   r   r    s   

zBaseMixin.setUpClassc                 C   s   t j  ttjjt| jd  }|r dt j_t	d|  d }tt
jt| jd  }|r<dt j_t	d|  d }d S )Nr   TDangling processes: rd   Dangling threads: )r  r   rn  r  r   r)   rt  ru  r?  r@  r   )r   r`   rb   r   r   r   r    s   
zBaseMixin.tearDownClassN)r\   r]   r^   rn  r  r  r   r   r   r   rs    s
    
rs  c                   @   s   e Zd ZdZejZejZeejZeej	Z	eej
Z
eejZeejZeejZeejZeejZeejZeejZeejZeejZeejZeejZeejZeejZeejZeejZdS )r-  r`   N)r\   r]   r^   r   r   r   r"  r  r   r   r   r  r   r   r  r  r  r  r  r  r   r]  r   r  r  r  r   r   r   r   r-    s,    
















r-  c                       s
  e Zd ZdZejZeedZ	eedZ
eedZeedZeedZeedZeedZeed	Zeed
ZeedZeedZeedZeedZeedZedd Ze fddZe fddZ  ZS )ManagerMixinra   zmanager.Queuezmanager.JoinableQueuezmanager.Lockzmanager.RLockzmanager.Semaphorezmanager.BoundedSemaphorezmanager.Conditionzmanager.Eventzmanager.Barrierzmanager.Valuezmanager.Arrayzmanager.listzmanager.dictzmanager.Namespacec                 O   s   | j j|i |S r   )ra   r  )r   rW   rX   r   r   r   r    r  zManagerMixin.Poolc                    s   t    t | _d S r   )r  r  r   rz  ra   r   r  r   r   r    r   zManagerMixin.setUpClassc                    s   t  }d}tt dkr<t | |d9 }t  | }|dkr4dtj_t	dt  d| d ntt dkst
  | j d	krXdtj_t	d
 t	| j  | j  | j  d | _t   d S )Nr   rd   r   r  Tr<  r=  r>  r   z5Shared objects which still exist at manager shutdown:)rU   rV   r   r   r   r   r  r   r?  r@  r  r  ra   _number_of_objects_debug_infor  r   r  r  )r   rA  rY   r(  r  r   r   r    s0   




zManagerMixin.tearDownClass)r\   r]   r^   r   r   r   r  operator
attrgetterr   r  r  r  r  r  r  r   r]  r   r  r   r  r  rn  r  r  r  rp  r   r   r  r   rx    s.    
rx  c                   @   s   e Zd ZdZejjZejjZeejj	Z	eejj
Z
eejjZeejjZeejjZeejjZeejjZeejjZeejjZeejjZeejjZeejjZeejjZeejjZeejjZdS )ThreadsMixinrb   N)r\   r]   r^   r   r   dummyr   r"  r  r   r   r  r   r   r  r  r  r  r  r  r   r]  r   r  r   r   r   r   r}    s&    r}  c                    sT  | d }t  }h d}| D ]z\}}t|tsqt|trm|tu r#qt|j|ks/J |j|jD ]9}d|  |dd   }|| d  }	G dd d||	t	j
}
|dkr^td	|
}
| |
_|
_||
_|
| |< q2qt|t	j
rG d
d d|t}
| |
_|
_||
_|
| |< qd d g d g fdd} fdd}|| d< || d< d S )Nr\   >   ra   rb   r`   Withrd   Mixinc                   @   r  z*install_tests_in_module_dict.<locals>.TempNr
  r   r   r   r   Temp  r  r  ra   r  c                   @   r  r  r
  r   r   r   r   r  &  r  c                     s   t t t j  t jj  d< tj  d< t jddd< z	t j	dd W n t
y8   td w tjdrRzt  } W n tyQ   tdw t  t  t  t d S )	Nr   rd   T)
allow_noner  z start method not supportedlinuxz1OSError raises on RLock creation, see issue 3111!)r   r  r  r)   _cleanuprt  r   r   r&  r  rG   rH   rI   r  r(  r  r  r  rL   r
   get_temp_dirrD  rE  rI  r  ru  old_start_methodstart_methodr   r   setUpModule/  s*   


z1install_tests_in_module_dict.<locals>.setUpModulec                     s   d} t j  tjd dd ttjjt d  }|r,d} dt j_t	d|  d }tt
jt d  }|rId} dt j_t	d|  d }| rRtd tj  d S )	NFr   Tr  rv  rd   rw  r>  )r  r   rn  r   r  r  r)   rt  r?  r@  r   rU   r   r
   _cleanup_tests)
need_sleepr`   rb   )ru  r  r   r   tearDownModuleE  s$   

z4install_tests_in_module_dict.<locals>.tearDownModuler  r  )globalsrL  r   r   r  r_   r  rs   
capitalizerH   TestCaser   requires_hashdigestr\   r^   r]   r  )remote_globsr  r]   local_globs	ALL_TYPESr.   basetype_newnamer  r  r  r  r   r  r   install_tests_in_module_dict  s@   




r  SemLockzSemLock not availabler  z
Linux onlyre  rf  c                   @   ry   )SemLockTestsc                 C   s>   G dd dt j}dt  }|ddd|d}t | d S )Nc                   @   r  )z3SemLockTests.test_semlock_subclass.<locals>.SemLockNr
  r   r   r   r   r  l  r  r  ztest_semlock_subclass-rd   r   r   F)r	   r  rD   r   
sem_unlink)rR   r  r.   r   r   r   r   test_semlock_subclassk  s   z"SemLockTests.test_semlock_subclassN)r\   r]   r^   r  r   r   r   r   r  f  s    r  rm  )rH   unittest.mockr#   r  rg  rU   rM  r  r  rD   r  r  r   r  rD  rc  rP  r  r8  r{  r  r  r  test.supportr  test.support.script_helperr   r   r   r   r   r   r   import_moduler	   r   rC  r   r  multiprocess.dummymultiprocess.heapmultiprocess.managersr  multiprocess.queuesr
   r   HAVE_SEND_HANDLEr  ImportErrormultiprocess.sharedctypesr   r   r0  r   	HAS_SHMEMr  r   r   rI   r  r  r'  r   r(   r   r$   r*   r.   r,   r0   rF  rI  r   re   r  r  r  rX  HAVE_GETVALUEr(  rg  r6   r9   rE   r  r  ctypesr>   r?   r@   rA   r  rL   rN   r_   ru   rz   r   r   rs  r}  r  r  r  r  r  r  r2  r5  rF  rG  rY  r\  r  r  r  r  r  r   r  r  rG   r	  r  r  rs  ru  rv  r  r  r  rE  r  r  r  r  r!  r  r   r  r  r  r  r  r  r  r  r  r  r  r,  r2  ro  rA  rX  r  r  r  r  r  r2  rC  rX  rb  rh  rx  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rq  r  r$  r-  r8  rd  rk  rs  r-  rx  r}  r  rj  r  r   r   r   r   <module>   s  





    /W  G6  *39 FS 
 
	  l(H:
14  "0
R h
8    {+E"! 2 "BCH #3) k=W