a 4dgx@s dZddlZddlZddlZddlmZmZddlZddlZddl Z ddl m Z e e eddZddZGd d d eZGd d d ejZGd ddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZdS)z/ Various tests for synchronization primitives. N)start_new_thread TIMEOUT_MAX)supportforkz9platform doesn't support fork (no _at_fork_reinit method)cCstddS)N{Gz?)timesleepr r +/usr/local/lib/python3.9/test/lock_tests.py_waitsr c@s2eZdZdZd ddZddZddZd d Zd S) Bunchz A bunch of threads. Fcsx_|_g_g_| _t_jfdd}zt |D]}t |dqLWnd_Yn0dS)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. c sZt}j|z$Wj|jsVtq*nj|jsTtqF0dSN) threading get_identstartedappendfinished _can_exitr )tidfselfr r task+s   zBunch.__init__..taskr TN) rnrrrrwait_threads_exit wait_thread __enter__ranger)rrrZwait_before_exitrir rr __init__s    zBunch.__init__cCst|j|jkrtqdSr )lenrrr rr r r wait_for_started<szBunch.wait_for_startedcCs,t|j|jkrtq|jddddSr )r rrr r__exit__r!r r r wait_for_finished@szBunch.wait_for_finishedcCs d|_dSNT)rr!r r r do_finishFszBunch.do_finishN)F)__name__ __module__ __qualname____doc__rr"r$r&r r r r r s  r c@s$eZdZddZddZddZdS) BaseTestCasecCst|_dSr )rZthreading_setup_threadsr!r r r setUpKszBaseTestCase.setUpcCstj|jtdSr )rZthreading_cleanupr, reap_childrenr!r r r tearDownNs zBaseTestCase.tearDowncCs$|||d|||ddS)Ng333333?g$@)ZassertGreaterEqual assertLess)ractualZexpectedr r r assertTimeoutRszBaseTestCase.assertTimeoutN)r'r(r)r-r/r2r r r r r+Jsr+c@sxeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZdS) BaseLockTestsz; Tests for both recursive and non-recursive locks. cCs|}~dSr )locktyperlockr r r test_constructor`szBaseLockTests.test_constructorcCs|}|t|d~dS)Nz)r4 assertRegexreprr5r r r test_reprdszBaseLockTests.test_reprcCs&|}||t|d~dS)Nz)r4acquirer8r9r5r r r test_locked_repriszBaseLockTests.test_locked_reprcCs|}|~dSr )r4r;r5r r r test_acquire_destroyosz"BaseLockTests.test_acquire_destroycCs|}||~dSr r4r;releaser5r r r test_acquire_releasetsz"BaseLockTests.test_acquire_releasecCs$|}||d|dSNF)r4 assertTruer;r?r5r r r test_try_acquirezszBaseLockTests.test_try_acquirecsJ|gfdd}t|d|ddS)NcsddSrArr;r r6resultr r rsz3BaseLockTests.test_try_acquire_contended..fr)r4r;r r$ assertFalser?rrr rEr test_try_acquire_contendedsz(BaseLockTests.test_try_acquire_contendedcsp|d}fdd}t||}|t|t|jd| |t|j|dS)NcsdSr r;r?r r6r r rsz/BaseLockTests.test_acquire_contended..fr) r4r;r r"r assertEqualr rr?r$rNrbr rMr test_acquire_contendeds  z$BaseLockTests.test_acquire_contendedcsV|fdd}dfdd }|t|d|t|tt|ddS)NcsdSr rLr rMr r rsz"BaseLockTests.test_with..fcs4|dur|Wdn1s&0YdSr r errrMr r _withsz&BaseLockTests.test_with.._withrG)N)r4r r$ assertRaises TypeError)rrrUr rMr test_withs zBaseLockTests.test_withcs`|fdd}tt}t|dtt|kr\td||ttdS)NcsdSr rLr rMr r rsz)BaseLockTests.test_thread_leak..fg?) r4r r enumerater r$rrrN)rrrr rMr test_thread_leaks   zBaseLockTests.test_thread_leakcs||tjdd|jtjdd|jtjdd|jtjtddjtdt}| jddt}| ||dgfdd}t |d | d |dd dS) NFrGitimeoutg}Ô%ITrKcs4t}jddt}||dS)N?r\)r monotonicrr;)t1t2r6resultsr r rsz%BaseLockTests.test_timeout..frr^)r4rV ValueErrorr; OverflowErrorrr?rr_rBr0r r$rHr2)rr`rarr rbr test_timeouts  zBaseLockTests.test_timeoutcCs"|}t|}||dSr )r4weakrefrefZassertIsNotNonerr6rhr r r test_weakref_existss z!BaseLockTests.test_weakref_existscCs$|}t|}~||dSr )r4rgrhZ assertIsNonerir r r test_weakref_deleteds z"BaseLockTests.test_weakref_deletedN)r'r(r)r*r7r:r<r=r@rCrJrRrXr[rfrjrkr r r r r3[s r3c@s4eZdZdZddZddZddZedd Zd S) LockTestszn Tests for non-recursive, weak locks (which can be acquired and released from different threads). cs|gfdd}tpt|dtdkrBtq.t|tdtdkrttq`|tdWdn1s0YdS)Ncs(dddSr r;rr r6Zphaser r rs z#LockTests.test_reacquire..fr rrG)r4rrrr r rNr?rIr rnr test_reacquires    zLockTests.test_reacquirecsB|fdd}t|d}|dS)Ncs dSr )r?r rMr r rsz*LockTests.test_different_thread..frG)r4r;r r$r?rrrQr rMr test_different_threads  zLockTests.test_different_threadcCsN|}|||jdd|||||jdddS)Nrr\F)blocking)r4r;rHr?lockedrBr5r r r test_state_after_timeouts z"LockTests.test_state_after_timeoutcCsDdd}|}||||}||||dS)NcSs||dSr rLrMr r r use_locksz/LockTests.test_at_fork_reinit..use_lock)r4_at_fork_reinitr;)rrvr6Zlock2r r r test_at_fork_reinitszLockTests.test_at_fork_reinitN) r'r(r)r*rprrru requires_forkrxr r r r rls   rlc@s8eZdZdZddZddZddZdd Zd d Zd S) RLockTestsz$ Tests for recursive locks. cCs<|}||||||dSr r>r5r r r rp*szRLockTests.test_reacquirecCsX|}|t|j|||||||t|jdSr )r4rV RuntimeErrorr?r;r5r r r test_release_unacquired3sz"RLockTests.test_release_unacquiredcCsX|}|t|j|||||||t|jdSr )r4rVr{ _release_saver;r?r5r r r test_release_save_unacquired?sz'RLockTests.test_release_save_unacquiredcsR|fdd}t|dd}z|tjW|n |0|dS)Ncs dSr )r;r rMr r rNsz+RLockTests.test_different_thread..frGT)r4r rVr{r?r&r$rqr rMr rrKs  z RLockTests.test_different_threadcs||||gfdd}t|d|d||dS)NcsdSr )r _is_ownedr rEr r r_sz$RLockTests.test__is_owned..frGr)r4rHrr;rBr r$r?rIr rEr test__is_ownedWszRLockTests.test__is_ownedN) r'r(r)r*rpr|r~rrrr r r r rz&s     rzc@sDeZdZdZddZddZddZdd Zd d Ze d d Z dS) EventTestsz" Tests for Event objects. cCsr|}||||||||||||||dSr ) eventtyperHis_setsetrBclearrevtr r r test_is_setnszEventTests.test_is_setcs|d}ggfdd}t||}|t|td||dg||dg|dS)NrKcs dSr rwaitr rresults1results2r r rsz#EventTests._check_notify..frT)r r"r rNr rr$)rrrPrrQr rr _check_notifyzs zEventTests._check_notifycCs0|}||||||dSr )rrrrrr r r test_notifys  zEventTests.test_notifycs|ggd}fdd}t|||dg|D]\}}||||dqHggt|||dg|D]\}}||qdS)NrKcs@dt}d}t}|||fdS)Ngr^)rrrr_)r`rrarr r rs  z"EventTests.test_timeout..fFr^T)rr r$rNrHr2rrB)rrPrrdtr rr rfs"   zEventTests.test_timeoutcsn|gdd}fdd}t||}|t||dg|dS)Ng?rKcsddSNrr rrcr]r r rsz(EventTests.test_set_and_clear..fT) rr r"rrrrr$rNrOr rr test_set_and_clears  zEventTests.test_set_and_clearcCs|}|j"||jdWdn1s60Y||j"||jdWdn1sv0YdSrA)r_condrHr;rwrr r r rxs 0zEventTests.test_at_fork_reinitN) r'r(r)r*rrrrfrryrxr r r r ris rc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)ConditionTestsz( Tests for condition variables. cCs|}||||t}||}|||d|||d||d|| ||dWdn1s0YdSrA)condtyper;r?rLockrHrB)rcondr6r r r test_acquires zConditionTests.test_acquirecCs|}|t|jdSr )rrVr{rrrr r r test_unacquired_waitsz#ConditionTests.test_unacquired_waitcCs|}|t|jdSr )rrVr{notifyrr r r test_unacquired_notifysz%ConditionTests.test_unacquired_notifycsd}gggdfdd}t||}|tdkrNtq:|gdtdtdkrtq|dgd|gtdkrtqdtdttd krtq|dgdd gd|d gdtdkrTtq< tdtdkrtqv|dgdd gd|d gdd gd| dS) NrKrcsd}|f}|fdSr )r;rrr?rFr phase_numreadyrrr r rs  z'ConditionTests._check_notify..frG)TrGro)Tro)Tr) r r"r r rrNr;rr? notify_allr$)rrrPrrQr rr rsX           zConditionTests._check_notifycCs |}||||dSr )rrrr r r r2s zConditionTests.test_notifycsd|gd}fdd}t|||t|D]\}}||d||q@dS)NrKcs@t}d}t}|||fdS)Nr^)r;rr_rr?r)r`rFrarrcr r r<s  z&ConditionTests.test_timeout..fr^)rr r$rNr r2rH)rrPrrrFr rr rf8s  zConditionTests.test_timeoutc sdfdd}t|d}|tdD]B}td d7Wdq61sn0Yq6|dS)NrcsP8fdd}|dWdn1sB0YdS)NcsdkSrr r stater r Sz8ConditionTests.test_waitfor..f..r)wait_forrBrNrrrrr r rQs z&ConditionTests.test_waitfor..frGrr)rr r"rrrrr$rrrQrr rr test_waitforNs   (zConditionTests.test_waitforc sdgfdd}t|d}|tdD]B}td d7Wdq<1st0Yq<|t ddS)NrcsrZt}jfdddd}t|}||ddWdn1sd0YdS)NcsdkSrr r rr r rfrz@ConditionTests.test_waitfor_timeout..f..g?r\)rr_rrHr2r)rrFrrrsuccessr r rcs   z.ConditionTests.test_waitfor_timeout..frGrr) rr r"rrrrr$rNr rr rr test_waitfor_timeout_s   (z#ConditionTests.test_waitfor_timeoutN) r'r(r)r*rrrrrrfrrr r r r rsJrc@s`eZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ dS)BaseSemaphoreTestszB Common tests for {bounded, unbounded} semaphore objects. cCs,|jt|jdd|jt|jtj ddS)N)value)rVrdsemtypesysmaxsizer!r r r r7|sz#BaseSemaphoreTests.test_constructorcCsH|d}|||d}||||dS)NrGro)rr;r?rsemr r r rs  zBaseSemaphoreTests.test_acquirecCs|}|~dSr )rr;rr r r r=sz'BaseSemaphoreTests.test_acquire_destroycst|dd}gggdfdd}t|d}|ttdkrhtqL|dgddtdD] }qttdkrtq|t dgddgdd tdD] }qttd krtq|t dgddgdd gd| d | |d gd dS)N rcs4dSr rDr rrrrZ sem_resultsr r rs z4BaseSemaphoreTests.test_acquire_contended..frG roFT) rr;r r"r r rNrr?sortedrHr$)rrPrrQrr rr rRs:    $  .z)BaseSemaphoreTests.test_acquire_contendedcs>|dggdfdd}t|d}|ttdkr^tqB|dgdddttdkrtq|tdgddgdd dttd krtq|tdgddgdd gd| d | dS) Nrrcs(dSr rmr rrrrr r rs z/BaseSemaphoreTests.test_multirelease..frrrGrrorF) rr;r r"r r rNr?rrHr$rqr rr test_multireleases0   $ .z$BaseSemaphoreTests.test_multireleasecCsV|d}||d||d||d|||ddS)NroF)rrBr;rHr?rr r r rCs  z#BaseSemaphoreTests.test_try_acquirecsV|dgfdd}t|d|tdgddgddS) Nrcs$dddSrArDr rcrr r rsz8BaseSemaphoreTests.test_try_acquire_contended..frKFrTr)rr;r r$rNrrIr rr rJs  z-BaseSemaphoreTests.test_try_acquire_contendedcCs|d}|jt|jddd||jdd||jdd||jdd|||jddt}||jddt|}| |ddS)NroF?r\g{Gzt?r^) rrVrdr;rBrHr?rr_r2)rrtrr r r test_acquire_timeouts  z'BaseSemaphoreTests.test_acquire_timeoutcsT|fdd}t|d}|t||j|dS)NcsdSr rLr rr r rsz0BaseSemaphoreTests.test_default_value..frG) rr;r r"r rHrr?r$rqr rr test_default_values   z%BaseSemaphoreTests.test_default_valuecsbddfdd }|dt|tddS)Nroc s|dd(d|r<|Wdn1sP0YWdn1sn0YdSrA)rBr;r?rHrSrr r rUsz+BaseSemaphoreTests.test_with.._withF)N)rrBr;r?rVrW)rrUr rr rXs zBaseSemaphoreTests.test_withN)r'r(r)r*r7rr=rRrrCrJrrrXr r r r rws %   rc@seZdZdZddZdS)SemaphoreTestsz) Tests for unbounded semaphores. cCs.|d}||||dSNrG)rr?r;rr r r r|s  z&SemaphoreTests.test_release_unacquiredNr'r(r)r*r|r r r r rsrc@seZdZdZddZdS)BoundedSemaphoreTestsz' Tests for bounded semaphores. cCs8|}|t|j|||t|jdSr )rrVrdr?r;rr r r r|(s z-BoundedSemaphoreTests.test_release_unacquiredNrr r r r r#src@seZdZdZdZdZddZddZdd Zd d Z d"d dZ ddZ ddZ ddZ ddZddZddZddZddZdd Zd!S)# BarrierTestsz$ Tests for Barrier objects. rKg@cCs|j|j|jd|_dS)Nr\) barriertyperPdefaultTimeoutbarrierr!r r r r-8szBarrierTests.setUpcCs|jdSr )rabortr!r r r r/:szBarrierTests.tearDowncCs"t||jd}||dSr)r rPr$rqr r r run_threads=szBarrierTests.run_threadscCs|jj}|||jt|D]h}|dd|t|d|||j|dd|t|d|d||jq||jjd| |jj dS)NrTrG) rpartiesrNrPrrr r n_waitingrHbroken)rrcrmrr r r multipassBs   zBarrierTests.multipassrGcs&gggfdd}|dS)z; Test that a barrier is passed in lockstep csdSr )rr passesrcrr r rTsz$BarrierTests.test_barrier..fNr)rrrr rr test_barrierOszBarrierTests.test_barriercCs |dS)zC Test that a barrier works for 10 consecutive runs r)rr!r r r test_barrier_10XszBarrierTests.test_barrier_10cs:gfdd}|tttjdS)z9 test the return value from barrier.wait csj}|dSr )rrr)rrcrr r rcs z(BarrierTests.test_wait_return..fN)rrNsumrrPrIr rr test_wait_return^s zBarrierTests.test_wait_returncs<gfdd}j|fdd}|dS)z, Test the 'action' callback csddSr%)rr )rcr r actionosz(BarrierTests.test_action..actioncstddSr)rrNr r rrcrr r rrsz#BarrierTests.test_action..fNrrPr)rrrr rr test_actionjs  zBarrierTests.test_actioncsZggfdd}|tdtjdjjdS)zK Test that an abort will put the barrier in a broken state csrz4j}|jdkrtjdWn8tjyRdYntyljYn0dSNroT)rrrPr{rrBrokenBarrierErrorrrrrrr r r~s    z"BarrierTests.test_abort..frrGN)rrNr rPrBrrrIr rr test_abortxs zBarrierTests.test_abortcsdgggfdd}|tdtjdtjdS)zL Test that a 'reset' on a barrier frees the waiting threads csj}|jdkrBjjjdkr6tdqjn8zjdWntj yxdYn0jddS)NrorGgMbP?T) rrrPrrrresetrrrrrrresults3rr r rs     z"BarrierTests.test_reset..frrGN)rrNr rPrIr rr test_resets zBarrierTests.test_resetcsrgggjfdd}|tdtjdtjdS)zF Test that a barrier can be reset after being broken. csz4j}|jdkrtjdWn8tjyRdYntyljYn0jdkrjjddSr) rrrPr{rrrrrrZbarrier2rrrrr r rs       z,BarrierTests.test_abort_and_reset..frrGN)rrPrrNr rIr rr test_abort_and_resets  z!BarrierTests.test_abort_and_resetcsfdd}|dS)z$ Test wait(timeout) cs:j}|jdkr"tdtjjjddS)Nrorr^)rrrPrrrVrrrr!r r rs   z$BarrierTests.test_timeout..fNrrIr r!r rfs zBarrierTests.test_timeoutcs,jjddfdd}|dS)z4 Test the barrier's default timeout g333333?r\cs4}|jdkr tdtjjdS)Nror)rrPrrrVrrrrrr r rs z,BarrierTests.test_default_timeout..fNrrIr rr test_default_timeoutsz!BarrierTests.test_default_timeoutcCs|d}||dSr)rr)rrQr r r test_single_threads zBarrierTests.test_single_threadN)rG)r'r(r)r*rPrr-r/rrrrrrrrrrfrrr r r r r1s"  "r)r*osrr_threadrrrZunittestrgtestrZ skipUnlesshasattrryr objectr ZTestCaser+r3rlrzrrrrrrr r r r s4  1DC_0