U
    
W[                     @   s   d Z ddlmZmZ ddlZddlZzddlZW n ek
rH   dZY nX dZddl	m
Z
 ddlmZ ddlmZ G dd	 d	Zee G d
d dejZG dd dejZdS )z)
Tests for L{twisted.python.threadable}.
    )divisionabsolute_importNzPlatform lacks thread support)_PY3)unittest)
threadablec                   @   s"   e Zd ZdgZdZdZdd ZdS )
TestObjectaMethod   c                 C   sL   t dD ]>}| j| j | _| _| j| j | _| jdkstd| jf qd S )N
   r   zz == %d, not 0 as expected)rangeyxzAssertionError)selfi r   >/usr/lib/python3/dist-packages/twisted/test/test_threadable.pyr      s    zTestObject.aMethodN)__name__
__module____qualname__Zsynchronizedr   r   r   r   r   r   r   r      s   r   c                   @   sH   e Zd Zdd Zdd Zdd Zdd Zed	k	r<ee_ee_d
d Z	d	S )SynchronizationTestsc                 C   sb   t r2ttdddk	r^| tjt  td n,ttdddk	r^| tjt  td dS )z
        Reduce the CPython check interval so that thread switches happen much
        more often, hopefully exercising more possible race conditions.  Also,
        delay actual test startup until the reactor has been started.
        getswitchintervalNgHz>getcheckinterval   )r   getattrsysZ
addCleanupsetswitchintervalr   setcheckintervalr   r   r   r   r   setUp'   s    zSynchronizationTests.setUpc                 C   s   |  dtjj dS )zk
        The name of a synchronized method is inaffected by the synchronization
        decorator.
        r   N)ZassertEqualr   r   r   r    r   r   r   test_synchronizedName7   s    z*SynchronizationTests.test_synchronizedNamec                    sT   t   g  tj fddd}|  |  |  d d | t  d dS )z
        L{threadable.isInIOThread} returns C{True} if and only if it is called
        in the same thread as L{threadable.registerAsIOThread}.
        c                      s     t S N)appendr   isInIOThreadr   ZforeignResultr   r   <lambda>G       z8SynchronizationTests.test_isInIOThread.<locals>.<lambda>targetr   z#Non-IO thread reported as IO threadz#IO thread reported as not IO threadN)	r   ZregisterAsIOThread	threadingThreadstartjoinZassertFalseZ
assertTruer%   )r   tr   r&   r   test_isInIOThread?   s    
  z&SynchronizationTests.test_isInIOThreadc                    sl   t  g   fdd}g }tdD ]"}tj|d}|| |  q$|D ]}|  qL rht d S )Nc               
      sP   zt dD ]}   q
W n0 tk
rJ } z t| W 5 d }~X Y nX d S Ni  )r   r   r   r$   str)r   eerrorsor   r   callMethodLotsU   s
    zHSynchronizationTests.testThreadedSynchronization.<locals>.callMethodLots   r)   )	r   r   r+   r,   r$   r-   r.   r   ZFailTest)r   r7   Zthreadsr   r/   r   r4   r   testThreadedSynchronizationP   s    


z0SynchronizationTests.testThreadedSynchronizationNc                 C   s    t  }tdD ]}|  qd S r1   )r   r   r   )r   r6   r   r   r   r   testUnthreadedSynchronizationm   s    z2SynchronizationTests.testUnthreadedSynchronization)
r   r   r   r!   r"   r0   r9   threadingSkipskipr:   r   r   r   r   r   &   s   r   c                   @   s*   e Zd Zdd Zedk	ree_dd ZdS )SerializationTestsc                 C   s4   t  }t|}t|}t|}| || d S r#   )r   ZXLocktypepickledumpsloadsZassertIsInstance)r   lockZlockType
lockPickleZnewLockr   r   r   testPicklingu   s
    

zSerializationTests.testPicklingNc                 C   s(   d}t |}t |d}t | d S )Ns6   ctwisted.python.threadable
unpickle_lock
p0
(tp1
Rp2
.   )r?   rA   r@   )r   rC   rB   Z	newPickler   r   r   testUnpickling   s    
z!SerializationTests.testUnpickling)r   r   r   rD   r;   r<   rF   r   r   r   r   r=   t   s   r=   )__doc__Z
__future__r   r   r   r?   r+   ImportErrorr;   Ztwisted.python.compatr   Ztwisted.trialr   Ztwisted.pythonr   r   ZsynchronizeZSynchronousTestCaser   r=   r   r   r   r   <module>   s   

N