Uname: Linux web3.us.cloudlogin.co 5.10.226-xeon-hst #2 SMP Fri Sep 13 12:28:44 UTC 2024 x86_64
Software: Apache
PHP version: 8.1.31 [ PHP INFO ] PHP os: Linux
Server Ip: 162.210.96.117
Your Ip: 3.22.75.216
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : lock_tests.cpython-310.pyc
o

`b�x�@s4dZddlZddlZddlZddlZddlmZmZddlZddl	Z	ddl
Z
ddlmZddl
mZe	�eed�d�Zdd	�ZGd
d�de�ZGdd
�d
e	j�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZdS) z/
Various tests for synchronization primitives.
�N)�start_new_thread�TIMEOUT_MAX)�support)�threading_helper�forkz9platform doesn't support fork (no _at_fork_reinit method)cCst�d�dS)N�{�G�z�?)�time�sleep�r
r
�8/usr/local/python-3.10/lib/python3.10/test/lock_tests.py�_waitsrc@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)
�Bunchz
    A bunch of threads.
    Fcsp��_|�_g�_g�_|�_t���_�j����fdd�}zt	|�D]}t
|d�q&WdSd�_�)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	sdt��}�j�|�z��W�j�|��js t��jrdSdS�j�|��js1t��jr+w�N)�	threading�	get_ident�started�append�finished�	_can_exitr)�tid��f�selfr
r�task-s���zBunch.__init__.<locals>.taskr
TN)r�nrrrr�wait_threads_exit�wait_thread�	__enter__�ranger)rrrZwait_before_exitr�ir
rr�__init__s


�zBunch.__init__cCs.t|j�|jkrt�t|j�|jksdSdSr)�lenrrr�rr
r
r�wait_for_started>s�zBunch.wait_for_startedcCs:t|j�|jkrt�t|j�|jks|j�ddd�dSr)r!rrrr�__exit__r"r
r
r�wait_for_finishedBs�zBunch.wait_for_finishedcCs
d|_dS�NT)rr"r
r
r�	do_finishHs
zBunch.do_finishN)F)�__name__�
__module__�__qualname__�__doc__r r#r%r'r
r
r
rr
s
r
c@s$eZdZdd�Zdd�Zdd�ZdS)�BaseTestCasecCst��|_dSr)rZthreading_setup�_threadsr"r
r
r�setUpM�zBaseTestCase.setUpcCstj|j�t��dSr)rZthreading_cleanupr-r�
reap_childrenr"r
r
r�tearDownPszBaseTestCase.tearDowncCs$|�||d�|�||d�dS)Ng333333�?g$@)ZassertGreaterEqual�
assertLess)r�actualZexpectedr
r
r�
assertTimeoutTszBaseTestCase.assertTimeoutN)r(r)r*r.r1r4r
r
r
rr,Lsr,c@sxeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)�
BaseLockTestsz;
    Tests for both recursive and non-recursive locks.
    cCs|��}~dSr)�locktype�r�lockr
r
r�test_constructorbszBaseLockTests.test_constructorcCs|��}|�t|�d�~dS)Nz<unlocked .* object (.*)?at .*>)r6�assertRegex�reprr7r
r
r�	test_reprfszBaseLockTests.test_reprcCs&|��}|��|�t|�d�~dS)Nz<locked .* object (.*)?at .*>)r6�acquirer:r;r7r
r
r�test_locked_reprkszBaseLockTests.test_locked_reprcC�|��}|��~dSr)r6r=r7r
r
r�test_acquire_destroyq�z"BaseLockTests.test_acquire_destroycCs|��}|��|��~dSr�r6r=�releaser7r
r
r�test_acquire_releasevsz"BaseLockTests.test_acquire_releasecCs$|��}|�|�d��|��dS�NF)r6�
assertTruer=rCr7r
r
r�test_try_acquire|szBaseLockTests.test_try_acquirecsJ|������g���fdd�}t|d���|��d����dS)Ncs����d��dSrE�rr=r
�r8�resultr
rr�sz3BaseLockTests.test_try_acquire_contended.<locals>.f�r)r6r=r
r%�assertFalserC�rrr
rIr�test_try_acquire_contended�sz(BaseLockTests.test_try_acquire_contendedcsp|������d}�fdd�}t||�}|��t�|�t|j�d����|�	�|�t|j�|�dS)N�c�������dSr�r=rCr
�r8r
rr��z/BaseLockTests.test_acquire_contended.<locals>.fr)
r6r=r
r#r�assertEqualr!rrCr%�r�Nr�br
rRr�test_acquire_contended�s
z$BaseLockTests.test_acquire_contendedcsV|����fdd�}d�fdd�	}|�t|d���|�t|t�t|d���dS)NcrPrrQr
rRr
rr�rSz"BaseLockTests.test_with.<locals>.fcs6��|dur	|�Wd�dS1swYdSrr
��errrRr
r�_with�s
�"�z&BaseLockTests.test_with.<locals>._withrKr)r6r
r%�assertRaises�	TypeError)rrr[r
rRr�	test_with�szBaseLockTests.test_withcsd|����fdd�}tt���}t|d���tt���|kr0t�d�|�|tt����dSdS)NcrPrrQr
rRr
rr�rSz)BaseLockTests.test_thread_leak.<locals>.f�g�������?)	r6r!r�	enumerater
r%rr	rT)rrrr
rRr�test_thread_leak�s
�zBaseLockTests.test_thread_leakcs�|���|�t�jdd�|jt�jdd�|jt�jdd�|jt�jtdd��jtd����t��}|�	�jdd��t��}|�
||d�g���fdd�}t|d���|�
�d	�|��dd
�dS)NFrKi������timeoutg}Ô%�I�TrOcs4t��}���jdd��t��}��||�dS)N��?rb)r�	monotonicrr=)�t1�t2�r8�resultsr
rr�sz%BaseLockTests.test_timeout.<locals>.frrd)r6r\�
ValueErrorr=�
OverflowErrorrrCrrerFr2r
r%rLr4)rrfrgrr
rhr�test_timeout�s zBaseLockTests.test_timeoutcCs"|��}t�|�}|�|��dSr)r6�weakref�refZassertIsNotNone�rr8rnr
r
r�test_weakref_exists�s
z!BaseLockTests.test_weakref_existscCs,|��}t�|�}~t��|�|��dSr)r6rmrn�gcZcollectZassertIsNoneror
r
r�test_weakref_deleted�s

z"BaseLockTests.test_weakref_deletedN)r(r)r*r+r9r<r>r@rDrGrNrXr^rarlrprrr
r
r
rr5]s
r5c@s4eZdZdZdd�Zdd�Zdd�Zedd	��Zd
S)�	LockTestszn
    Tests for non-recursive, weak locks
    (which can be acquired and released from different threads).
    cs�|���g���fdd�}t���Ct|d�t��dkr&t�t��dkst�|�t��d����t��dkrDt�t��dks;|�t��d�Wd�dS1sWwYdS)Ncs(�����d������d�dSr�r=rr
�r8Zphaser
rr��
z#LockTests.test_reacquire.<locals>.fr
rrK�)r6rrrr!rrTrCrMr
rur�test_reacquire�s 

��"�zLockTests.test_reacquirecsB|�������fdd�}t|d�}|��������dS)Nc����dSr)rCr
rRr
rr�z*LockTests.test_different_thread.<locals>.frK)r6r=r
r%rC�rrrWr
rRr�test_different_threads
zLockTests.test_different_threadcCsN|��}|��|�|jdd��|��|�|���|�|jdd��dS)NrrbF)�blocking)r6r=rLrC�lockedrFr7r
r
r�test_state_after_timeoutsz"LockTests.test_state_after_timeoutcCsDdd�}|��}|��||�|��}|��|��||�dS)NcSs|��|��dSrrQrRr
r
r�use_locksz/LockTests.test_at_fork_reinit.<locals>.use_lock)r6�_at_fork_reinitr=)rr�r8Zlock2r
r
r�test_at_fork_reinitszLockTests.test_at_fork_reinitN)	r(r)r*r+rxr|r�
requires_forkr�r
r
r
rrs�s
rsc@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�
RLockTestsz$
    Tests for recursive locks.
    cCs<|��}|��|��|��|��|��|��dSrrBr7r
r
rrx-szRLockTests.test_reacquirecCsX|��}|�t|j�|��|��|��|��|��|��|�t|j�dSr)r6r\�RuntimeErrorrCr=r7r
r
r�test_release_unacquired6�z"RLockTests.test_release_unacquiredcCsX|��}|�t|j�|��|��|��|��|��|��|�t|j�dSr)r6r\r��
_release_saver=rCr7r
r
r�test_release_save_unacquiredBr�z'RLockTests.test_release_save_unacquiredcsR|����fdd�}t|dd�}z
|�t�j�W|��n|��w|��dS)Ncryr)r=r
rRr
rrQrzz+RLockTests.test_different_thread.<locals>.frKT)r6r
r\r�rCr'r%r{r
rRrr|Nsz RLockTests.test_different_threadcs�|���|��������|��������|�����g���fdd�}t|d���|��d����|��������|�����dS)Ncs������dSr)r�	_is_ownedr
rIr
rrbsz$RLockTests.test__is_owned.<locals>.frKr)r6rLr�r=rFr
r%rCrMr
rIr�test__is_ownedZszRLockTests.test__is_ownedN)	r(r)r*r+rxr�r�r|r�r
r
r
rr�)s	r�c@sDeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Ze	dd
��Z
dS)�
EventTestsz"
    Tests for Event objects.
    cCsr|��}|�|���|��|�|���|��|�|���|��|�|���|��|�|���dSr)�	eventtyperL�is_set�setrF�clear�r�evtr
r
r�test_is_setqszEventTests.test_is_setcs|d}g�g����fdd�}t||�}|��t�|�t��d����|��|��dg|�|��dg|�dS)NrOcs ������������dSr�r�waitr
�r��results1�results2r
rr�sz#EventTests._check_notify.<locals>.frT)r
r#rrTr!r�r%)rr�rVrrWr
r�r�
_check_notify}s
zEventTests._check_notifycCs0|��}|�|�|��|��|�|�dSr)r�r�r�r�r�r
r
r�test_notify�s

zEventTests.test_notifycs�|���g�g�d}���fdd�}t||���|��dg|��D]\}}|�|�|�|d�q$g�g����t||���|��dg|��D]	\}}|�|�qNdS)NrOcs@����d��t��}��d�}t��}��|||f�dS)Ngrd)rr�rre)rf�rrgr�r
rr�s

z"EventTests.test_timeout.<locals>.fFrdT)r�r
r%rTrLr4r�rF)rrVrr��dtr
r�rrl�s$
�zEventTests.test_timeoutcsn|���g�d�d}���fdd�}t||�}|��t���������|��|��dg|�dS)Ng�?rOcs�����d��dS�N�r�r
�r�rircr
rr��z(EventTests.test_set_and_clear.<locals>.fT)	r�r
r#rr	r�r�r%rTrUr
r�r�test_set_and_clear�s

zEventTests.test_set_and_clearcCs�|��}|j�|�|j�d��Wd�n1swY|��|j�|�|j�d��Wd�dS1s<wYdSrE)r��_condrLr=r�r�r
r
rr��s�"�zEventTests.test_at_fork_reinitN)r(r)r*r+r�r�r�rlr�r�r�r
r
r
rr�lsr�c@sPeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�ZdS)�ConditionTestsz(
    Tests for condition variables.
    cCs�|��}|��|��|��|��t��}|�|�}|��|�|�d��|��|�|�d��|�|�d��|��|�|�|�d��Wd�dS1sWwYdSrE)�condtyper=rCr�LockrLrF)r�condr8r
r
r�test_acquire�s 
"�zConditionTests.test_acquirecC�|��}|�t|j�dSr)r�r\r�r��rr�r
r
r�test_unacquired_wait��z#ConditionTests.test_unacquired_waitcCr�r)r�r\r��notifyr�r
r
r�test_unacquired_notify�r�z%ConditionTests.test_unacquired_notifycsd}g�g�g�d������fdd�}t||�}|��t��dkr,t�t��dks#���|��g������d�t�d����t��dkrWt�t��dksN|��dgd�|��g�t��dkrut�t��dksl�����d�t�d����t��t��d	kr�t�t��t��d	ks�|��dgdd
gd�|��d
gd�t��dkr�t�t��dks������	�t�d����t��dkr�t�t��dks�|��dgdd
gd�|��d
gddgd�|�
�dS)NrOrcsd����������}�����|�f�����������}�����|�f�dSr)r=rr�rC�rJ�r��	phase_num�readyr�r�r
rr�s

z'ConditionTests._check_notify.<locals>.f�rK)TrKrw�)Trw)Tr�)r
r#r!rr�rTr=r�rC�
notify_allr%)rr�rVrrWr
r�rr��sd
�
��
���zConditionTests._check_notifycCs |��}|�|�|�|�dSr)r�r�r�r
r
rr�5s
zConditionTests.test_notifycsd|���g�d}��fdd�}t||���|�t��|��D]\}}|�|d�|�|�q dS)NrOcs@���t��}��d�}t��}�����|||f�dS)Nrd)r=rrer�rCr)rfrJrg�r�rir
rr?s
z&ConditionTests.test_timeout.<locals>.frd)r�r
r%rTr!r4rL)rrVrr�rJr
r�rrl;s�zConditionTests.test_timeoutc	s�����d����fdd�}t|d�}|��td�D]!}t�d����d7����Wd�n1s7wYq|��dS)NrcsR�����fdd��}��|����d�Wd�dS1s"wYdS)Nc��dkSr�r
r
��stater
r�<lambda>V�z8ConditionTests.test_waitfor.<locals>.f.<locals>.<lambda>r�)�wait_forrFrTr��r�rr�r
rrTs

"�z&ConditionTests.test_waitfor.<locals>.frKr�r)r�r
r#rrr	r�r%�rrrWrr
r�r�test_waitforQs


��zConditionTests.test_waitforc	s�����d�g�����fdd�}t|d�}|��td�D]!}t�d����d7����Wd�n1s:wYq|����t	��d�dS)Nrcst��.t��}�j�fdd�dd�}t��|}��|���|d���d�Wd�dS1s3wYdS)Ncr�r�r
r
r�r
rr�ir�z@ConditionTests.test_waitfor_timeout.<locals>.f.<locals>.<lambda>g�������?rb)rrer�rLr4r)r�rJ�r�rr��successr
rrfs
"�z.ConditionTests.test_waitfor_timeout.<locals>.frKr�r)
r�r
r#rrr	r�r%rTr!r�r
r�r�test_waitfor_timeoutbs


��z#ConditionTests.test_waitfor_timeoutN)r(r)r*r+r�r�r�r�r�rlr�r�r
r
r
rr��sJr�c@s`eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dS)�BaseSemaphoreTestszB
    Common tests for {bounded, unbounded} semaphore objects.
    cCs,|jt|jdd�|jt|jtjd�dS)N���)�value)r\rj�semtype�sys�maxsizer"r
r
rr9sz#BaseSemaphoreTests.test_constructorcCsH|�d�}|��|��|�d�}|��|��|��|��dS)NrKrw)r�r=rC�r�semr
r
rr��s

zBaseSemaphoreTests.test_acquirecCr?r)r�r=r�r
r
rr@�rAz'BaseSemaphoreTests.test_acquire_destroycs�|�d�����d}g�g�g�d������fdd�}t|d�}|��t��t��dkr=t�t��t��dks0|���dgd�d�td�D]}���qNt��t��dkrlt�t��t��dks_|�t	���dgddgd�d	�td�D]}���q�t��t��d
kr�t�t��t��d
ks�|�t	���dgddgdd	gd�|�
��d�����|��|��dgd
�dS)N��
rcs4��������������������dSrrHr
�r�r�r�r�Zsem_resultsr
rr�s
z4BaseSemaphoreTests.test_acquire_contended.<locals>.f�rK�
rw�FT�)r�r=r
r#r!rrTrrC�sortedrLr%)rrVrrWrr
r�rrX�s@

�
�$
�.z)BaseSemaphoreTests.test_acquire_contendedcst|�d�����g�g�d�����fdd�}t|d�}|��t��t��dkr8t�t��t��dks+|���dgd�d���d�t��t��dkrat�t��t��dksT|�t���dgddgd�d	���d�t��t��d
kr�t�t��t��d
ks�|�t���dgddgdd	gd�|�	��d�����|�
�dS)Nr�rcs(��������������dSrrtr
�r�r�r�r�r
rr�rvz/BaseSemaphoreTests.test_multirelease.<locals>.fr�r�rKr�rwr�F)r�r=r
r#r!rrTrCr�rLr%r{r
r�r�test_multirelease�s6

�
�$
�.z$BaseSemaphoreTests.test_multireleasecCsV|�d�}|�|�d��|�|�d��|�|�d��|��|�|�d��dS)NrwF)r�rFr=rLrCr�r
r
rrG�s
z#BaseSemaphoreTests.test_try_acquirecsV|�d�����g���fdd�}t|d���|�t��dgddgd�dS)	Nr�cs$����d������d��dSrErHr
�rir�r
rr�sz8BaseSemaphoreTests.test_try_acquire_contended.<locals>.frOFr�Tr�)r�r=r
r%rTr�rMr
r�rrN�s
$z-BaseSemaphoreTests.test_try_acquire_contendedcCs�|�d�}|jt|jddd�|�|jdd��|�|jdd��|�|jdd��|��|�|jdd��t��}|�|jdd��t��|}|�	|d�dS)NrwF��?rbg{�G�zt?rd)
r�r\rjr=rFrLrCrrer4)rr��tr�r
r
r�test_acquire_timeout�s
z'BaseSemaphoreTests.test_acquire_timeoutcsT|�������fdd�}t|d�}|��t�|�|j����|��dS)NcrPrrQr
�r�r
rr�rSz0BaseSemaphoreTests.test_default_value.<locals>.frK)	r�r=r
r#rrLrrCr%r{r
r�r�test_default_value�s
z%BaseSemaphoreTests.test_default_valuecsb��d��d��fdd�	}|�����d�������t|t�����d�����dS)Nrwc	s���;����d�����������d��|r|�Wd�n1s(wYWd�dSWd�dS1s@wYdSrE)rFr=rCrLrYr�r
rr[	s���"�z+BaseSemaphoreTests.test_with.<locals>._withFr)r�rFr=rCr\r])rr[r
r�rr^s
zBaseSemaphoreTests.test_withN)r(r)r*r+r9r�r@rXr�rGrNr�r�r^r
r
r
rr�zs
% 

r�c@�eZdZdZdd�ZdS)�SemaphoreTestsz)
    Tests for unbounded semaphores.
    cCs.|�d�}|��|��|��|��dS�NrK)r�rCr=r�r
r
rr�s

z&SemaphoreTests.test_release_unacquiredN�r(r)r*r+r�r
r
r
rr��r�c@r�)�BoundedSemaphoreTestsz'
    Tests for bounded semaphores.
    cCs8|��}|�t|j�|��|��|�t|j�dSr)r�r\rjrCr=r�r
r
rr�+s
z-BoundedSemaphoreTests.test_release_unacquiredNr�r
r
r
rr�&r�r�c@s�eZdZdZdZdZdd�Zdd�Zdd	�Zd
d�Z	d"d
d�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!S)#�BarrierTestsz$
    Tests for Barrier objects.
    rOg@cCs|j|j|jd�|_dS)Nrb)�barriertyperV�defaultTimeout�barrierr"r
r
rr.;r�zBarrierTests.setUpcCs|j��dSr)r��abortr"r
r
rr1=r/zBarrierTests.tearDowncCs"t||jd�}|�|��dSr�)r
rVr%r{r
r
r�run_threads@szBarrierTests.run_threadscCs�|jj}|�||j�t|�D]4}|d�d�|�t|d�||�|j��|d�d�|�t|d�|d|�|j��q|�|jjd�|�	|jj
�dS)NrTrK)r��partiesrTrVrrr!r��	n_waitingrL�broken)rrir�mrr
r
r�	multipassEs
zBarrierTests.multipassrKcs&ggg����fdd�}��|�dS)z;
        Test that a barrier is passed in lockstep
        cs�����dSr)r�r
��passesrirr
rrWsz$BarrierTests.test_barrier.<locals>.fN�r�)rr�rr
r�r�test_barrierRszBarrierTests.test_barriercCs
|�d�S)zC
        Test that a barrier works for 10 consecutive runs
        r�)r�r"r
r
r�test_barrier_10[s
zBarrierTests.test_barrier_10cs:g���fdd�}��|���t��tt�j���dS)z9
        test the return value from barrier.wait
        cs�j��}��|�dSr)r�r�r)r��rirr
rrfs
z(BarrierTests.test_wait_return.<locals>.fN)r�rT�sumrrVrMr
r�r�test_wait_returnas
zBarrierTests.test_wait_returncs<g��fdd�}���j|�����fdd�}��|�dS)z,
        Test the 'action' callback
        cs��d�dSr&)rr
)rir
r�actionrr/z(BarrierTests.test_action.<locals>.actioncs�����t��d�dSr�)r�rTr!r
�r�rirr
rrusz#BarrierTests.test_action.<locals>.fN�r�rVr�)rr�rr
r�r�test_actionms
zBarrierTests.test_actioncsZg�g����fdd�}��|���t��d���t���jd����jj�dS)zK
        Test that an abort will put the barrier in a broken state
        cstz�j��}|�jdkrt��j����d�WdStjy+��d�YdSty9�j��YdSw�NrwT)r�r�rVr�rr�BrokenBarrierErrorr��r�r�r�rr
rr�s


�z"BarrierTests.test_abort.<locals>.frrKN)r�rTr!rVrFr�r�rMr
r�r�
test_abort{s

zBarrierTests.test_abortcsdg�g�g�����fdd�}��|���t��d���t���jd���t���j�dS)zL
        Test that a 'reset' on a barrier frees the waiting threads
        cs��j��}|�jdkr)�jj�jdkr#t�d��jj�jdks�j��nz�j����d�Wntj	yD��d�Ynw�j����d�dS)NrwrKg����MbP?T)
r�r�rVr�rr	�resetrrr�r��r�r��results3rr
rr�s

�
�
z"BarrierTests.test_reset.<locals>.frrKN)r�rTr!rVrMr
r�r�
test_reset�s
zBarrierTests.test_resetcsrg�g�g����j�������fdd�}��|���t��d���t���jd���t���j�dS)zF
        Test that a barrier can be reset after being broken.
        cs�z�j��}|�jdkrt��j����d�Wntjy)��d�Ynty6�j��Ynw����jdkrE�j������j����d�dSr�)	r�r�rVr�rrr�r�r�r��Zbarrier2r�r�r�rr
rr�s"


�

z,BarrierTests.test_abort_and_reset.<locals>.frrKN)r�rVr�rTr!rMr
rr�test_abort_and_reset�s
z!BarrierTests.test_abort_and_resetcs�fdd�}��|�dS)z$
        Test wait(timeout)
        cs:�j��}|�jdkrt�d���tj�jjd�dS)Nrwr�rd)r�r�rVrr	r\rr�r�r"r
rr�s

�z$BarrierTests.test_timeout.<locals>.fNr�rMr
r"rrl�szBarrierTests.test_timeoutcs,�j�jdd����fdd�}��|�dS)z4
        Test the barrier's default timeout
        g333333�?rbcs4���}|�jdkrt�d���tj�j�dS)Nrwr�)r�rVrr	r\rr�r��r�rr
rr�s
z,BarrierTests.test_default_timeout.<locals>.fNr�rMr
rr�test_default_timeout�sz!BarrierTests.test_default_timeoutcCs|�d�}|��|��dSr�)r�r�)rrWr
r
r�test_single_thread�s
zBarrierTests.test_single_threadN)rK)r(r)r*r+rVr�r.r1r�r�r�r�r�r�r�r�rrlrrr
r
r
rr�4s$

	"r�) r+�osrqr�r�_threadrrrZunittestrm�testrZtest.supportrZ
skipUnless�hasattrr�r�objectr
ZTestCaser,r5rsr�r�r�r�r�r�r�r
r
r
r�<module>s:�1	DC_0
© 2025 GrazzMean