add-determinism 0.7.3

RPM buildroot helper to strip nondeterministic bits in files
Documentation
3

�
�^�p�@sdZddlZddlZddlmZmZddlZddlZddlZddl	m
Z
dd�ZGdd�de�Z
Gd	d
�d
ej�ZGdd�de�ZGd
d�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)�supportcCstjd�dS)Ng{�G�z�?)�time�sleep�rr�'/usr/lib64/python3.6/test/lock_tests.py�_waitsr	c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)
�Bunchz
    A bunch of threads.
    Fc
s|��_|�_g�_g�_|�_tj��_�jj���fdd�}y xt	|�D]}t
|f�qNWWnd�_�YnXdS)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.
        csDtj�}�jj|�z
��Wd�jj|�x�js<t�q.WXdS)N)�	threading�	get_ident�started�append�finished�	_can_exitr	)�tid)�f�selfrr�task%s
zBunch.__init__.<locals>.taskTN)r�nr
rrr�wait_threads_exit�wait_thread�	__enter__�ranger)rrrZwait_before_exitr�ir)rrr�__init__s


zBunch.__init__cCs xt|j�|jkrt�qWdS)N)�lenr
rr	)rrrr�wait_for_started6szBunch.wait_for_startedcCs0xt|j�|jkrt�qW|jjddd�dS)N)rrrr	r�__exit__)rrrr�wait_for_finished:s
zBunch.wait_for_finishedcCs
d|_dS)NT)r)rrrr�	do_finish@szBunch.do_finishN)F)�__name__�
__module__�__qualname__�__doc__rrrr rrrrr
s

r
c@s$eZdZdd�Zdd�Zdd�ZdS)�BaseTestCasecCstj�|_dS)N)rZthreading_setup�_threads)rrrr�setUpEszBaseTestCase.setUpcCstj|j�tj�dS)N)rZthreading_cleanupr&Z
reap_children)rrrr�tearDownHszBaseTestCase.tearDowncCs$|j||d�|j||d�dS)Ng333333�?g$@)ZassertGreaterEqual�
assertLess)rZactualZexpectedrrr�
assertTimeoutLszBaseTestCase.assertTimeoutN)r!r"r#r'r(r*rrrrr%Dsr%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|j�}~dS)N)�locktype)r�lockrrr�test_constructorZszBaseLockTests.test_constructorcCs|j�}|jt|�d�~dS)Nz<unlocked .* object (.*)?at .*>)r,�assertRegex�repr)rr-rrr�	test_repr^szBaseLockTests.test_reprcCs&|j�}|j�|jt|�d�~dS)Nz<locked .* object (.*)?at .*>)r,�acquirer/r0)rr-rrr�test_locked_reprcszBaseLockTests.test_locked_reprcCs|j�}|j�~dS)N)r,r2)rr-rrr�test_acquire_destroyisz"BaseLockTests.test_acquire_destroycCs|j�}|j�|j�~dS)N)r,r2�release)rr-rrr�test_acquire_releasensz"BaseLockTests.test_acquire_releasecCs$|j�}|j|jd��|j�dS)NF)r,�
assertTruer2r5)rr-rrr�test_try_acquiretszBaseLockTests.test_try_acquirecsJ|j���j�g���fdd�}t|d�j�|j�d��j�dS)Ncs�j�jd��dS)NF)rr2r)r-�resultrrr}sz3BaseLockTests.test_try_acquire_contended.<locals>.f�r)r,r2r
r�assertFalser5)rrr)r-r9r�test_try_acquire_contendedysz(BaseLockTests.test_try_acquire_contendedcsp|j���j�d}�fdd�}t||�}|j�t�|jt|j�d��j�|j	�|jt|j�|�dS)N�cs�j��j�dS)N)r2r5r)r-rrr�sz/BaseLockTests.test_acquire_contended.<locals>.fr)
r,r2r
rr	�assertEqualrrr5r)r�Nr�br)r-r�test_acquire_contended�s
z$BaseLockTests.test_acquire_contendedcsV|j���fdd�}d�fdd�	}|�t|d�j�|jt|t�t|d�j�dS)Ncs�j��j�dS)N)r2r5r)r-rrr�sz"BaseLockTests.test_with.<locals>.fc	s ��|dk	r|�WdQRXdS)Nr)�err)r-rr�_with�sz&BaseLockTests.test_with.<locals>._withr:)N)r,r
r�assertRaises�	TypeError)rrrCr)r-r�	test_with�szBaseLockTests.test_withcs`|j���fdd�}ttj��}t|d�j�ttj��|kr\tjd�|j|ttj���dS)Ncs�j��j�dS)N)r2r5r)r-rrr�sz)BaseLockTests.test_thread_leak.<locals>.f�g�������?)	r,rr�	enumerater
rrrr>)rrrr)r-r�test_thread_leak�s
zBaseLockTests.test_thread_leakcs�|j��|jt�jdd�|jt�jd
d�|jt�jdd�|jt�jtdd��jtd��j�tj�}|j�jdd��tj�}|j	||d�g���fdd�}t
|d�j�|j�d�|j
�dd	�dS)Nrr:�d)�timeoutg}Ô%�I�Tr=cs4tj�}�j�jdd��tj�}�j||�dS)Ng�?)rK)rrr2)�t1�t2)r-�resultsrrr�sz%BaseLockTests.test_timeout.<locals>.fg�?i����)r,rD�
ValueErrorr2�
OverflowErrorrr5rr7r)r
rr;r*)rrLrMrr)r-rNr�test_timeout�s zBaseLockTests.test_timeoutcCs"|j�}tj|�}|j|��dS)N)r,�weakref�refZassertIsNotNone)rr-rSrrr�test_weakref_exists�s
z!BaseLockTests.test_weakref_existscCs$|j�}tj|�}~|j|��dS)N)r,rRrSZassertIsNone)rr-rSrrr�test_weakref_deleted�s
z"BaseLockTests.test_weakref_deletedN)r!r"r#r$r.r1r3r4r6r8r<rArFrIrQrTrUrrrrr+Us
r+c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�	LockTestszn
    Tests for non-recursive, weak locks
    (which can be acquired and released from different threads).
    c
s�|j��g���fdd�}tj��nt|f�xt��dkrDt�q0Wt�|jt��d��j�xt��dkrzt�qfW|jt��d�WdQRXdS)Ncs(�j��jd��j��jd�dS)N)r2rr)r-�phaserrr�s
z#LockTests.test_reacquire.<locals>.frr:�)r,rrrrr	r>r5)rrr)r-rWr�test_reacquire�s



zLockTests.test_reacquirecsB|j���j��fdd�}t|d�}|j��j��j�dS)Ncs�j�dS)N)r5r)r-rrr�sz*LockTests.test_different_thread.<locals>.fr:)r,r2r
rr5)rrr@r)r-r�test_different_thread�s
zLockTests.test_different_threadcCsN|j�}|j�|j|jdd��|j�|j|j��|j|jdd��dS)Ng{�G�z�?)rKF)Zblocking)r,r2r;r5�lockedr7)rr-rrr�test_state_after_timeoutsz"LockTests.test_state_after_timeoutN)r!r"r#r$rYrZr\rrrrrV�srVc@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�
RLockTestsz$
    Tests for recursive locks.
    cCs<|j�}|j�|j�|j�|j�|j�|j�dS)N)r,r2r5)rr-rrrrYszRLockTests.test_reacquirecCsX|j�}|jt|j�|j�|j�|j�|j�|j�|j�|jt|j�dS)N)r,rD�RuntimeErrorr5r2)rr-rrr�test_release_unacquiredsz"RLockTests.test_release_unacquiredcCsX|j�}|jt|j�|j�|j�|j�|j�|j�|j�|jt|j�dS)N)r,rDr^�
_release_saver2r5)rr-rrr�test_release_save_unacquired&sz'RLockTests.test_release_save_unacquiredc
sJ|j���fdd�}t|dd�}z|jt�j�Wd|j�X|j�dS)Ncs�j�dS)N)r2r)r-rrr5sz+RLockTests.test_different_thread.<locals>.fr:T)r,r
rDr^r5r r)rrr@r)r-rrZ2s
z RLockTests.test_different_threadcs�|j��|j�j���j�|j�j���j�|j�j��g���fdd�}t|d�j�|j�d��j�|j�j���j�|j�j��dS)Ncs�j�j��dS)N)r�	_is_ownedr)r-r9rrrFsz$RLockTests.test__is_owned.<locals>.fr:r)r,r;rbr2r7r
rr5)rrr)r-r9r�test__is_owned>szRLockTests.test__is_ownedN)	r!r"r#r$rYr_rarZrcrrrrr]
s	r]c@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�
EventTestsz"
    Tests for Event objects.
    cCsr|j�}|j|j��|j�|j|j��|j�|j|j��|j�|j|j��|j�|j|j��dS)N)�	eventtyper;Zis_set�setr7�clear)r�evtrrr�test_is_setUszEventTests.test_is_setcs|d}g�g����fdd�}t||�}|j�t�|jt��d��j�|j�|j�dg|�|j�dg|�dS)Nr=cs �j�j���j�j��dS)N)r�waitr)rh�results1�results2rrrfsz#EventTests._check_notify.<locals>.frT)r
rr	r>rrfr)rrhr?rr@r)rhrkrlr�
_check_notifyas
zEventTests._check_notifycCs0|j�}|j|�|j�|j�|j|�dS)N)rermrfrg)rrhrrr�test_notifyrs

zEventTests.test_notifycs�|j��g�g�d}���fdd�}t||�j�|j�dg|�x&�D]\}}|j|�|j|d�qJWg�g��j�t||�j�|j�dg|�x�D]\}}|j|�q�WdS)Nr=cs@�j�jd��tj�}�jd�}tj�}�j|||f�dS)Ngg�?)rrjr)rL�rrM)rhrkrlrrrs

z"EventTests.test_timeout.<locals>.fFg�?T)rer
rr>r;r*rfr7)rr?rro�dtr)rhrkrlrrQzs"
zEventTests.test_timeoutcsn|j��g�d�d}���fdd�}t||�}|j�tj���j��j�|j�|j�dg|�dS)Ng�?r=cs�j�j�d��dS)N�)rrjr)rhrNrKrrr�sz(EventTests.test_set_and_clear.<locals>.fT)	rer
rrrrfrgrr>)rr?rr@r)rhrNrKr�test_set_and_clear�s

zEventTests.test_set_and_clearcCs\|j�}|j�|j|jjd��WdQRX|j�|j�|j|jjd��WdQRXdS)NF)reZ_condr;r2Z_reset_internal_locks)rrhrrr�test_reset_internal_locks�sz$EventTests.test_reset_internal_locksN)
r!r"r#r$rirmrnrQrrrsrrrrrdPsrdc@sPeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�ZdS)�ConditionTestsz(
    Tests for condition variables.
    c
Cs�|j�}|j�|j�|j�|j�tj�}|j|�}|j�|j|jd��|j�|j|jd��|j|jd��|j�|�|j|jd��WdQRXdS)NF)�condtyper2r5rZLockr;r7)r�condr-rrr�test_acquire�s
zConditionTests.test_acquirecCs|j�}|jt|j�dS)N)rurDr^rj)rrvrrr�test_unacquired_wait�sz#ConditionTests.test_unacquired_waitcCs|j�}|jt|j�dS)N)rurDr^�notify)rrvrrr�test_unacquired_notify�sz%ConditionTests.test_unacquired_notifycs�d}g�g�g�d������fdd�}t||�}|j�xt��dkrPt�q<W�j�|j�g��j��jd�t�d��j�xt��dkr�t�q�W|j�d
gd�|j�g�xt��dkr�t�q�W�j��jd�t�d��j�x"t��t��d	k�rt��q�W|j�dgddgd�|j�d
gd�xt��dk�rht��qPW�j��j	�t�d��j�xt��dk�r�t��q�W|j�dgddgd�|j�dgddgd�|j
�dS)Nr=rcsd�j��j���j�}�j��j|�f��j��j���j�}�j��j|�f�dS)N)r2rrjr5)r9)rv�	phase_num�readyrkrlrrr�s

z'ConditionTests._check_notify.<locals>.f�r:TrX�)Tr:)Tr:)TrX)TrX)Tr:)TrX)TrX)Tr})r
rrr	rgr>r2ryr5Z
notify_allr)rrvr?rr@r)rvr{r|rkrlrrm�sX





zConditionTests._check_notifycCs |j�}|j|�|j|�dS)N)rurm)rrvrrrrns
zConditionTests.test_notifycsh|j��g�d}��fdd�}t||�j�|jt��|�x&�D]\}}|j|d�|j|�qBWdS)Nr=cs@�j�tj�}�jd�}tj�}�j��j|||f�dS)Ng�?)r2rrjr5r)rLr9rM)rvrNrrr"s
z&ConditionTests.test_timeout.<locals>.fg�?)rur
rr>rr*r;)rr?rrpr9r)rvrNrrQszConditionTests.test_timeoutc
sv�j��d����fdd�}t|d�}|j�x:td�D].}tjd����d7��j�WdQRXq8W|j�dS)Nrcs<��.�j�fdd��}�j|��j�d�WdQRXdS)Ncs�dkS)Nrqrr)�staterr�<lambda>9sz8ConditionTests.test_waitfor.<locals>.f.<locals>.<lambda>rq)�wait_forr7r>)r9)rvrrrrr7s
z&ConditionTests.test_waitfor.<locals>.fr:rqg{�G�z�?)rur
rrrrryr)rrr@rr)rvrrr�test_waitfor4s

zConditionTests.test_waitforc
s��j��d�g�����fdd�}t|d�}|j�x:td�D].}tjd����d7��j�WdQRXq>W|j��jt	��d�dS)Nrcs^��Ptj�}�j�fdd�dd�}tj�|}�j|��j|d��jd�WdQRXdS)Ncs�dkS)Nrqrr)rrrr�Lsz@ConditionTests.test_waitfor_timeout.<locals>.f.<locals>.<lambda>g�������?)rK)rr�r;r*r)rpr9)rvrr�successrrrIs
z.ConditionTests.test_waitfor_timeout.<locals>.fr:r}g{�G�z�?)
rur
rrrrryrr>r)rrr@rr)rvrrr�r�test_waitfor_timeoutEs

z#ConditionTests.test_waitfor_timeoutN)r!r"r#r$rwrxrzrmrnrQr�r�rrrrrt�sJrtc@sXeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�ZdS)�BaseSemaphoreTestszB
    Common tests for {bounded, unbounded} semaphore objects.
    cCs,|jt|jdd�|jt|jtjd�dS)Nr:)�value�����)rDrO�semtype�sys�maxsize)rrrrr.bsz#BaseSemaphoreTests.test_constructorcCsH|jd�}|j�|j�|jd�}|j�|j�|j�|j�dS)Nr:rX)r�r2r5)r�semrrrrwfs

zBaseSemaphoreTests.test_acquirecCs|j�}|j�~dS)N)r�r2)rr�rrrr4psz'BaseSemaphoreTests.test_acquire_destroycs�|jd���j�d}g�g�g�d������fdd�}t|d�}|j�xt��t��dkrjt�qNW|j��dgd�d�xtd�D]}�j�q�Wxt��t��dkr�t�q�W|jt	���dgddgd�d	�xtd�D]}�j�q�Wx"t��t��d
k�r$t��qW|jt	���dgddgdd	gd�|j
�jd���j�|j�|j�dgd�dS)N��
rcs4�j�j���j���j�j���j��dS)N)rr2r)r{rkrlr��sem_resultsrrr}s
z4BaseSemaphoreTests.test_acquire_contended.<locals>.f�r:�
rX�FTr�r��)r�r2r
rrr	r>rr5�sortedr;r)rr?rr@rr)r{rkrlr�r�rrAus:



$.z)BaseSemaphoreTests.test_acquire_contendedcCsV|jd�}|j|jd��|j|jd��|j|jd��|j�|j|jd��dS)NrXF)r�r7r2r;r5)rr�rrrr8�s
z#BaseSemaphoreTests.test_try_acquirecsV|jd���j�g���fdd�}t|d�j�|jt��dgddgd�dS)	Nrqcs$�j�jd���j�jd��dS)NF)rr2r)rNr�rrr�sz8BaseSemaphoreTests.test_try_acquire_contended.<locals>.fr=Fr�Tr})r�r2r
rr>r�)rrr)rNr�rr<�s
z-BaseSemaphoreTests.test_try_acquire_contendedcCs�|jd�}|jt|jddd�|j|jdd��|j|jdd��|j|jdd��|j�|j|jdd��tj�}|j|jdd��tj�|}|j|d�dS)NrXFg�?)rKg{�G�zt?g�?)	r�rDrOr2r7r;r5rr*)rr��trprrr�test_acquire_timeout�s
z'BaseSemaphoreTests.test_acquire_timeoutcsT|j���j��fdd�}t|d�}|j�t�|j|j��j�|j�dS)Ncs�j��j�dS)N)r2r5r)r�rrr�sz0BaseSemaphoreTests.test_default_value.<locals>.fr:)	r�r2r
rr	r;rr5r)rrr@r)r�r�test_default_value�s
z%BaseSemaphoreTests.test_default_valuecsb�jd��d��fdd�	}|��j�jd���j��jt|t��j�jd���j�dS)NrXcsT��F�j�jd���j����j�jd��|r<|�WdQRXWdQRXdS)NF)r7r2r5r;)rB)rr�rrrC�sz+BaseSemaphoreTests.test_with.<locals>._withF)N)r�r7r2r5rDrE)rrCr)rr�rrF�s
zBaseSemaphoreTests.test_withN)
r!r"r#r$r.rwr4rAr8r<r�r�rFrrrrr�]s
%

r�c@seZdZdZdd�ZdS)�SemaphoreTestsz)
    Tests for unbounded semaphores.
    cCs.|jd�}|j�|j�|j�|j�dS)Nr:)r�r5r2)rr�rrrr_�s

z&SemaphoreTests.test_release_unacquiredN)r!r"r#r$r_rrrrr��sr�c@seZdZdZdd�ZdS)�BoundedSemaphoreTestsz'
    Tests for bounded semaphores.
    cCs8|j�}|jt|j�|j�|j�|jt|j�dS)N)r�rDrOr5r2)rr�rrrr_�s
z-BoundedSemaphoreTests.test_release_unacquiredN)r!r"r#r$r_rrrrr��sr�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.
    r=g@cCs|j|j|jd�|_dS)N)rK)�barriertyper?�defaultTimeout�barrier)rrrrr'�szBarrierTests.setUpcCs|jj�dS)N)r��abort)rrrrr(szBarrierTests.tearDowncCs"t||jd�}|�|j�dS)Nr:)r
r?r)rrr@rrr�run_threadsszBarrierTests.run_threadscCs�|jj}|j||j�xtt|�D]h}|djd�|jt|d�||�|jj�|djd�|jt|d�|d|�|jj�q W|j|jjd�|j	|jj
�dS)NrTr:)r�Zpartiesr>r?rrrrj�	n_waitingr;�broken)rrNr�mrrrr�	multipasss
zBarrierTests.multipassr:cs&ggg����fdd�}�j|�dS)z;
        Test that a barrier is passed in lockstep
        cs�j���dS)N)r�r)�passesrNrrrrsz$BarrierTests.test_barrier.<locals>.fN)r�)rr�rr)r�rNrr�test_barrierszBarrierTests.test_barriercCs
|jd�S)zC
        Test that a barrier works for 10 consecutive runs
        r�)r�)rrrr�test_barrier_10szBarrierTests.test_barrier_10cs:g���fdd�}�j|��jt��tt�j���dS)z9
        test the return value from barrier.wait
        cs�jj�}�j|�dS)N)r�rjr)ro)rNrrrr)s
z(BarrierTests.test_wait_return.<locals>.fN)r�r>�sumrr?)rrr)rNrr�test_wait_return$s
zBarrierTests.test_wait_returncs<g��fdd�}�j�j|�����fdd�}�j|�dS)z,
        Test the 'action' callback
        cs�jd�dS)NT)rr)rNrr�action5sz(BarrierTests.test_action.<locals>.actioncs�j��jt��d�dS)Nr:)rjr>rr)r�rNrrrr8sz#BarrierTests.test_action.<locals>.fN)r�r?r�)rr�rr)r�rNrr�test_action0s
zBarrierTests.test_actioncsZg�g����fdd�}�j|��jt��d��jt���jd��j�jj�dS)zK
        Test that an abort will put the barrier in a broken state
        csvy4�jj�}|�jdkrt��jj��jd�Wn<tjk
rT�jd�Yntk
rp�jj�YnXdS)NrXT)r�rjr?r^rr�BrokenBarrierErrorr�)r)rkrlrrrrDs


z"BarrierTests.test_abort.<locals>.frr:N)r�r>rr?r7r�r�)rrr)rkrlrr�
test_abort>s
zBarrierTests.test_abortcsdg�g�g�����fdd�}�j|��jt��d��jt���jd��jt���j�dS)zL
        Test that a 'reset' on a barrier frees the waiting threads
        cs��jj�}|�jdkrFx �jj�jdkr8tjd�qW�jj�n:y�jj��jd�Wn tj	k
r~�jd�YnX�jj��jd�dS)NrXr:g����MbP?T)
r�rjr?r�rr�resetrrr�)r)rkrl�results3rrrr]s


z"BarrierTests.test_reset.<locals>.frr:N)r�r>rr?)rrr)rkrlr�rr�
test_resetVs
zBarrierTests.test_resetcsrg�g�g��j�j�������fdd�}�j|��jt��d��jt���jd��jt���j�dS)zF
        Test that a barrier can be reset after being broken.
        cs�y4�jj�}|�jdkrt��jj��jd�Wn<tjk
rT�jd�Yntk
rp�jj�YnX�j��jdkr��jj��j��jj��jd�dS)NrXT)	r�rjr?r^rrr�r�r�)r)�barrier2rkrlr�rrrr|s 




z,BarrierTests.test_abort_and_reset.<locals>.frr:N)r�r?r�r>r)rrr)r�rkrlr�rr�test_abort_and_resetts
z!BarrierTests.test_abort_and_resetcs�fdd�}�j|�dS)z$
        Test wait(timeout)
        cs:�jj�}|�jdkr"tjd��jtj�jjd�dS)NrXg�?g�?)r�rjr?rrrDrr�)r)rrrr�s


z$BarrierTests.test_timeout.<locals>.fN)r�)rrr)rrrQ�szBarrierTests.test_timeoutcs,�j�jdd����fdd�}�j|�dS)z4
        Test the barrier's default timeout
        g333333�?)rKcs4�j�}|�jdkr tjd��jtj�j�dS)NrXg�?)rjr?rrrDrr�)r)r�rrrr�s
z,BarrierTests.test_default_timeout.<locals>.fN)r�r?r�)rrr)r�rr�test_default_timeout�sz!BarrierTests.test_default_timeoutcCs|jd�}|j�|j�dS)Nr:)r�rj)rr@rrr�test_single_thread�s
zBarrierTests.test_single_threadN)r:)r!r"r#r$r?r�r'r(r�r�r�r�r�r�r�r�r�rQr�r�rrrrr��s"
	"r�)r$r�r�_threadrrrZunittestrRZtestrr	�objectr
ZTestCaser%r+rVr]rdrtr�r�r�r�rrrr�<module>s*11C^0~