
    5f                         d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ d dlmZ e j                  d        Z
 G d dej                        Zy)	    N)mock)debug)	greenpool)
pipe_mutexc               #      K   t         j                  } t        j                  d       	 d  t        j                  |        y # t        j                  |        w xY ww)NF)r   DEBUGeventlet_debughub_exceptions)
orig_states    E/usr/lib/python3/dist-packages/oslo_log/tests/unit/test_pipe_mutex.pyquiet_eventlet_exceptionsr      sA     J!!%(2%%j1%%j1s   &AA AAAc                   \    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zed        Zy)TestPipeMutexz,From  Swift's test/unit/common/test_utils.pyc                 6    t        j                         | _        y N)r   	PipeMutexmutexselfs    r   setUpzTestPipeMutex.setUp'   s    ))+
    c                 8    | j                   j                          y r   )r   closer   s    r   tearDownzTestPipeMutex.tearDown*   s    

r   c                     t         j                  j                         t         j                  j                         t         j                  j                          fd}t        j                  |       j	                           j                   j                  j                  d             j                  d       j	                           j                   j                  j                  d             y )Nc                      j                   j                           j                  d       j                          j                   j	                          j                  d       y )Nzgot the lockzreleased the lock)r   acquiresendwaitrelease)	evt_lock1	evt_lock2
evt_unlockr   s   r   get_the_lockz4TestPipeMutex.test_nonblocking.<locals>.get_the_lock2   sF    JJ NN>*NNJJ OO/0r   Fblockingzplease release the lock)
eventleteventEventspawnr   assertFalser   r   r   
assertTrue)r   r$   r!   r"   r#   s   ` @@@r   test_nonblockingzTestPipeMutex.test_nonblocking-   s    NN((*	NN((*	^^))+
	1 	|$++U+;<01

**E*:;r   c                 P     j                   j                  j                  d              j                   j                  j                  d              fd} j                  t	        j
                  |      j                                 j                  j                           j                  t	        j
                  |      j                                 j                  j                           j                  t	        j
                  |      j                                y )NFr%   c                  <     j                   j                  d      S )NFr%   )r   r   r   s   r   try_acquire_lockz6TestPipeMutex.test_recursive.<locals>.try_acquire_lockE   s    ::%%u%55r   )r,   r   r   r+   r'   r*   r   r    )r   r0   s   ` r   test_recursivezTestPipeMutex.test_recursiveA   s    

**E*:;

**E*:;	6 	(89>>@A

(89>>@A

'78==?@r   c                 X    | j                  t        | j                  j                         y r   )assertRaisesRuntimeErrorr   r    r   s    r   test_release_without_acquirez*TestPipeMutex.test_release_without_acquireN   s    ,

(:(:;r   c                     | j                   j                          | j                   j                          | j                  t        | j                   j                         y r   )r   r   r    r3   r4   r   s    r   test_too_many_releasesz$TestPipeMutex.test_too_many_releasesQ   s<    



,

(:(:;r   c                    | j                   j                          t               5  | j                  t        t        j                  | j                   j                        j                         d d d        y # 1 sw Y   y xY wr   )	r   r   r   r3   r4   r'   r*   r    r   r   s    r   test_wrong_releaserz!TestPipeMutex.test_wrong_releaserV   s^    

&( 	Gl&nnTZZ-?-?@EEG	G 	G 	Gs   AA66A?c                 "    t         j                  j                         g  fd} fd}t        j                  |      }t        j                  |      }|j	                          |j	                           j                  g d       y )Nc                      t        j                  d       j                  j                          j	                  d        j                  d       j                  j                          j	                  d       y )Nr   coro1 acquiregocoro1 release)r'   sleepr   r   appendr   r    evtr   sequences   r   coro1z*TestPipeMutex.test_blocking.<locals>.coro1a   sR    NN1JJ OOO,HHTNJJ OOO,r   c                       j                          j                  j                          j                  d       j                  j	                          j                  d       y )Ncoro2 acquirecoro2 release)r   r   r   r@   r    rA   s   r   coro2z*TestPipeMutex.test_blocking.<locals>.coro2j   sD    HHJJJ OOO,JJ OOO,r   )r<   r>   rF   rG   )r'   r(   r)   r*   r   assertEqual)r   rD   rH   c1c2rB   rC   s   `    @@r   test_blockingzTestPipeMutex.test_blocking\   si    nn""$	-	- ^^E"^^E"
	
	 $ 	r   c                 *    g  fd}t        j                  |      }t        j                  |      }t         j                  j                  d      j	                  |      }|j                          t         j                  j                  d      j	                  |      }|j                          |j                          |j                          |j                          |j                           j                  dj                        d       y )Nc                     d} | dkD  rwj                   j                          j                  d       t        j                  d       j                  d       j                   j                          | dz  } | dkD  rvy y )N
   r   <g-C6?>   )r   r   r@   r'   r?   r    )nr   rC   s    r   do_stuffz3TestPipeMutex.test_blocking_tpool.<locals>.do_stuff   se    Aa%

""$$v&$

""$Q a%r   	threadingtarget zP<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>)	r'   r*   patcheroriginalThreadstartr   joinrI   )r   rT   greenthread1greenthread2real_thread1real_thread2rC   s   `     @r   test_blocking_tpoolz!TestPipeMutex.test_blocking_tpool}   s     	  ~~h/~~h/''00=DD E ''00=DD E *I6r   c                    	 t         j                  j                  d      j                         t         j                  j                  d      j                         t         j                  j                  d      j                         g 	g  	fd} 	fd}t         j                  j                  d      j	                  |      }|j                          t         j                  j                  d      j	                  |      }|j                          |j                          |j                           j                  	        j                   j                  j                         y )NrU   c                  .   j                  t        t        j                  j	                                      j
                  j                          j                  j
                  j                         j                          t        j                  j                  fd} t        j                  j                  t        j                  d|       5  j
                  j                          d d d        j                          y # 1 sw Y   xY w)Nc                  `    	  | i |j                          S # j                          w xY wr   )r   )akworig_os_writepthread1_events     r   patched_os_writez[TestPipeMutex.test_blocking_preserves_ownership.<locals>.pthread1.<locals>.patched_os_write   s.    *(!2r2"'')N'')s    -write)r@   idr'   greenthread
getcurrentr   r   ownersetr   osrk   r   patchobjectr    )rj   rh   ro   ri   pthread2_event1pthread2_event2r   	thread_ids    @r   pthread1zATestPipeMutex.test_blocking_preserves_ownership.<locals>.pthread1   s    R 4 4 ? ? ABCJJ LL))*!&MM//M* "":==';KL %

""$%!% %s   DDc                     j                          j                  t        t        j                  j                                      j                  j                          j                          j                           j                  j                  j                         j                  j                          y r   )r   r@   rl   r'   rm   rn   r   r   rp   ro   r    )ro   ri   rt   ru   r   rv   s   r   pthread2zATestPipeMutex.test_blocking_preserves_ownership.<locals>.pthread2   s      "R 4 4 ? ? ABCJJ    "LL))*JJ r   rV   )r'   rY   rZ   r)   r[   r\   r]   rI   assertIsNoner   ro   )
r   rw   ry   r`   ra   ro   ri   rt   ru   rv   s
   `    @@@@@r   !test_blocking_preserves_ownershipz/TestPipeMutex.test_blocking_preserves_ownership   s,   !))22;?EEG"**33K@FFH"**33K@FFH		" 	"$	! 	!  ''00=DD E ''00=DD E E*$****+r   c                 B    t         j                  j                  d       y )NT)r'   r   hub_prevent_multiple_readers)clss    r   tearDownClasszTestPipeMutex.tearDownClass   s     	33D9r   N)__name__
__module____qualname____doc__r   r   r-   r1   r5   r7   r9   rL   rb   r{   classmethodr    r   r   r   r   %   sP    6,<(A<<
GB 7D-,^ : :r   r   )
contextlibunittestr   r'   r   r	   r   oslo_logr   contextmanagerr   TestCaser   r   r   r   <module>r      sJ         ,   2 2l:H%% l:r   