a zeNx@s(dZddlZddlZddlZddlZddlmZmZddlZddl Z ddl Z ddl m Z e eeddZddZGd d d eZGd d d e jZGd 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 C/opt/bitninja-python-dojo/embedded/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_finishedAszBunch.wait_for_finishedcCs d|_dSNT)rr!r r r do_finishGszBunch.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 setUpLszBaseTestCase.setUpcCstj|jtdSr )rZthreading_cleanupr, reap_childrenr!r r r tearDownOs zBaseTestCase.tearDowncCs$|||d|||ddS)Ng333333?g$@)ZassertGreaterEqual assertLess)ractualZexpectedr r r assertTimeoutSszBaseTestCase.assertTimeoutN)r'r(r)r-r/r2r r r r r+Ksr+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_constructoraszBaseLockTests.test_constructorcCs|}|t|d~dS)Nz)r4 assertRegexreprr5r r r test_represzBaseLockTests.test_reprcCs&|}||t|d~dS)Nz)r4acquirer8r9r5r r r test_locked_reprjszBaseLockTests.test_locked_reprcCs|}|~dSr )r4r;r5r r r test_acquire_destroypsz"BaseLockTests.test_acquire_destroycCs|}||~dSr r4r;releaser5r r r test_acquire_releaseusz"BaseLockTests.test_acquire_releasecCs$|}||d|dSNF)r4 assertTruer;r?r5r r r test_try_acquire{szBaseLockTests.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|}~t||dSr )r4rgrhgcZcollectZ assertIsNonerir r r test_weakref_deleteds  z"BaseLockTests.test_weakref_deletedN)r'r(r)r*r7r:r<r=r@rCrJrRrXr[rfrjrlr 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 ror 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_timeout s 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;)rrwr6Zlock2r r r test_at_fork_reinitszLockTests.test_at_fork_reinitN) r'r(r)r*rqrsrv requires_forkryr r r r rms   rmc@s8eZdZdZddZddZddZdd Zd d Zd S) RLockTestsz$ Tests for recursive locks. cCs<|}||||||dSr r>r5r r r rq,szRLockTests.test_reacquirecCsX|}|t|j|||||||t|jdSr )r4rV RuntimeErrorr?r;r5r r r test_release_unacquired5sz"RLockTests.test_release_unacquiredcCsX|}|t|j|||||||t|jdSr )r4rVr| _release_saver;r?r5r r r test_release_save_unacquiredAsz'RLockTests.test_release_save_unacquiredcsR|fdd}t|dd}z|tjW|n |0|dS)Ncs dSr )r;r rMr r rPsz+RLockTests.test_different_thread..frGT)r4r rVr|r?r&r$rrr rMr rsMs  z RLockTests.test_different_threadcs||||gfdd}t|d|d||dS)NcsdSr )r _is_ownedr rEr r rasz$RLockTests.test__is_owned..frGr)r4rHrr;rBr r$r?rIr rEr test__is_ownedYszRLockTests.test__is_ownedN) r'r(r)r*rqr}rrsrr r r r r{(s     r{c@sDeZdZdZddZddZddZdd Zd d Ze d d Z dS) EventTestsz" Tests for Event objects. cCsr|}||||||||||||||dSr ) eventtyperHis_setsetrBclearrevtr r r test_is_setpszEventTests.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_notify|s 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;rxrr r r rys 0zEventTests.test_at_fork_reinitN) r'r(r)r*rrrrfrrzryr r r r rks 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)TrGrp)Trp)Tr) r r"r r rrNr;rr? notify_allr$)rrrPrrQr rr rsX           zConditionTests._check_notifycCs |}||||dSr )rrrr r r r4s 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 rf:s  zConditionTests.test_timeoutc sdfdd}t|d}|tdD]B}td d7Wdq61sn0Yq6|dS)NrcsP8fdd}|dWdn1sB0YdS)NcsdkSrr r stater r Uz8ConditionTests.test_waitfor..f..r)wait_forrBrNrrrrr r rSs z&ConditionTests.test_waitfor..frGrr)rr r"rrrrr$rrrQrr rr test_waitforPs   (zConditionTests.test_waitforc sdgfdd}t|d}|tdD]B}td d7Wdq<1st0Yq<|t ddS)NrcsrZt}jfdddd}t|}||ddWdn1sd0YdS)NcsdkSrr r rr r rhrz@ConditionTests.test_waitfor_timeout..f..g?r\)rr_rrHr2r)rrFrrrsuccessr r res   z.ConditionTests.test_waitfor_timeout..frGrr) rr r"rrrrr$rNr rr rr test_waitfor_timeoutas   (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)NrGrp)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 rpFT) 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 rnr rrrrr r rs z/BaseSemaphoreTests.test_multirelease..frrrGrrprF) rr;r r"r r rNr?rrHr$rrr rr test_multireleases0   $ .z$BaseSemaphoreTests.test_multireleasecCsV|d}||d||d||d|||ddS)NrpF)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)NrpF?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$rrr rr test_default_values   z%BaseSemaphoreTests.test_default_valuecsbddfdd }|dt|tddS)Nrpc 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 rys %   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-:szBarrierTests.setUpcCs|jdSr )rabortr!r r r r/<szBarrierTests.tearDowncCs"t||jd}||dSr)r rPr$rrr 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 multipassDs   zBarrierTests.multipassrGcs&gggfdd}|dS)z; Test that a barrier is passed in lockstep csdSr )rr passesrcrr r rVsz$BarrierTests.test_barrier..fNr)rrrr rr test_barrierQszBarrierTests.test_barriercCs |dS)zC Test that a barrier works for 10 consecutive runs r)rr!r r r test_barrier_10ZszBarrierTests.test_barrier_10cs:gfdd}|tttjdS)z9 test the return value from barrier.wait csj}|dSr )rrr)rrcrr r res 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 actionqsz(BarrierTests.test_action..actioncstddSr)rrNr r rrcrr r rtsz#BarrierTests.test_action..fNrrPr)rrrr rr test_actionls  zBarrierTests.test_actioncsZggfdd}|tdtjdjjdS)zK Test that an abort will put the barrier in a broken state csrz4j}|jdkrtjdWn8tjyRdYntyljYn0dSNrpT)rrrPr|rrBrokenBarrierErrorrrrrrr r rs    z"BarrierTests.test_abort..frrGN)rrNr rPrBrrrIr rr test_abortzs zBarrierTests.test_abortcsdgggfdd}|tdtjdtjdS)zL Test that a 'reset' on a barrier frees the waiting threads csj}|jdkrBjjjdkr6tdqjn8zjdWntj yxdYn0jddS)NrprGgMbP?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)Nrprr^)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)Nrpr)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 r3s"  "r)r*osrkrr_threadrrrZunittestrgtestrZ skipUnlesshasattrrzr objectr ZTestCaser+r3rmr{rrrrrrr r r r s6  1 DC_0