Ë
    oj&>  ã                  óî   — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ d
ZdZ ej(                  «       r ed«      € ed«      €dZdZ G d„ de«      Z G d„ de«      Zy)z'
Tests for L{twisted.python.lockfile}.
é    )ÚannotationsN)ÚskipIfÚ
skipUnless)ÚNoReturn)Úlockfile)ÚrequireModule)Úplatform)ÚTestCaseFÚ zwin32api.OpenProcessÚ
pywintypesTzZOn windows, lockfile.kill is not implemented in the absence of win32api and/or pywintypes.c                  óä   — e Zd ZdZdd„Z e ej                  «       d«      dd„«       Zdd„Z	 e ej                  «       d«      dd„«       Z
 eee«      dd„«       Z eee«      dd	„«       Zdd
„Zy)Ú	UtilTestszM
    Tests for the helper functions used to implement L{FilesystemLock}.
    c                óð   — | j                  «       }t        j                  d|«       | j                  t        t        j                  d|«      }| j                  |j                  t        j                  «       y)z 
        L{lockfile.symlink} raises L{OSError} with C{errno} set to L{EEXIST}
        when an attempt is made to create a symlink which already exists.
        ÚfooN)Úmktempr   ÚsymlinkÚassertRaisesÚOSErrorÚassertEqualÚerrnoÚEEXIST©ÚselfÚnameÚexcs      ú</usr/lib/python3/dist-packages/twisted/test/test_lockfile.pyÚtest_symlinkEEXISTzUtilTests.test_symlinkEEXIST(   sS   € ð
 �{‰{‹}ˆÜ×Ñ˜ Ô%Ø×Ñ¤¬×)9Ñ)9¸5À$ÓGˆØ×Ñ˜Ÿ™¤E§L¡LÕ1ó    úBspecial rename EIO handling only necessary and correct on Windows.c                óú   — | j                  «       }dd„}| j                  t        d|«       | j                  t        t        j
                  |d«      }| j                  |j                  t        j                  «       y)a<  
        L{lockfile.symlink} raises L{OSError} with C{errno} set to L{EIO} when
        the underlying L{rename} call fails with L{EIO}.

        Renaming a file on Windows may fail if the target of the rename is in
        the process of being deleted (directory deletion appears not to be
        atomic).
        c                ó6   — t        t        j                  d «      ‚©N©r   r   ÚEIO©ÚsrcÚdsts     r   Ú
fakeRenamez4UtilTests.test_symlinkEIOWindows.<locals>.fakeRenameA   s   € Üœ%Ÿ)™) TÓ*Ð*r   Úrenamer   N©r&   Ústrr'   r+   Úreturnr   )	r   Úpatchr   r   ÚIOErrorr   r   r   r$   )r   r   r(   r   s       r   Útest_symlinkEIOWindowsz UtilTests.test_symlinkEIOWindows2   sZ   € ð �{‰{‹}ˆó	+ð 	�
‰
”8˜X zÔ2Ø×Ñ¤¬×)9Ñ)9¸4ÀÓGˆØ×Ñ˜Ÿ™¤E§I¡IÕ.r   c                óÂ   — | j                  «       }| j                  t        t        j                  |«      }| j                  |j                  t        j                  «       y)zŸ
        L{lockfile.readlink} raises L{OSError} with C{errno} set to L{ENOENT}
        when an attempt is made to read a symlink which does not exist.
        N)r   r   r   r   Úreadlinkr   r   ÚENOENTr   s      r   Útest_readlinkENOENTzUtilTests.test_readlinkENOENTH   sA   € ð
 �{‰{‹}ˆØ×Ñ¤¬×):Ñ):¸DÓAˆØ×Ñ˜Ÿ™¤E§L¡LÕ1r   úGspecial readlink EACCES handling only necessary and correct on Windows.c                óø   — | j                  «       }dd„}| j                  t        d|«       | j                  t        t        j
                  |«      }| j                  |j                  t        j                  «       y)a\  
        L{lockfile.readlink} raises L{OSError} with C{errno} set to L{EACCES}
        on Windows when the underlying file open attempt fails with C{EACCES}.

        Opening a file on Windows may fail if the path is inside a directory
        which is in the process of being deleted (directory deletion appears
        not to be atomic).
        c                ó6   — t        t        j                  d «      ‚r"   ©r   r   ÚEACCES)ÚpathÚmodes     r   ÚfakeOpenz6UtilTests.test_readlinkEACCESWindows.<locals>.fakeOpen`   ó   € Üœ%Ÿ,™,¨Ó-Ð-r   Ú_openN)r9   r+   r:   r+   r,   r   )	r   r-   r   r   r.   r1   r   r   r8   )r   r   r;   r   s       r   Útest_readlinkEACCESWindowsz$UtilTests.test_readlinkEACCESWindowsQ   sX   € ð �{‰{‹}ˆó	.ð 	�
‰
”8˜W hÔ/Ø×Ñ¤¬×):Ñ):¸DÓAˆØ×Ñ˜Ÿ™¤E§L¡LÕ1r   c                óT   — t        j                  t        j                  «       d«       y)z}
        L{lockfile.kill} returns without error if passed the PID of a
        process which exists and signal C{0}.
        r   N)r   ÚkillÚosÚgetpid©r   s    r   Ú	test_killzUtilTests.test_killg   s   € ô 	�‰”b—i‘i“k 1Õ%r   c                ó¤   — | j                  t        t        j                  dd«      }| j	                  |j
                  t
        j                  «       y)z�
        L{lockfile.kill} raises L{OSError} with errno of L{ESRCH} if
        passed a PID which does not correspond to any process.
        iÿÿÿr   N)r   r   r   r@   r   r   ÚESRCH)r   r   s     r   Útest_killESRCHzUtilTests.test_killESRCHo   s6   € ð ×Ñ¤¬¯©¸	À1ÓEˆØ×Ñ˜Ÿ™¤E§K¡KÕ0r   c                óÖ   — | j                  t        dd«       t        j                  | j                  «       «      }|j	                  «        | j                  |j	                  «       «       y)zµ
        Verify that when L{lockfile.kill} does end up as None (e.g. on Windows
        without pywin32), it doesn't end up being called and raising a
        L{TypeError}.
        r@   N)r-   r   ÚFilesystemLockr   ÚlockÚassertFalse)r   Úfls     r   Útest_noKillCallzUtilTests.test_noKillCally   sG   € ð 	�
‰
”8˜V TÔ*Ü×$Ñ$ T§[¡[£]Ó3ˆØ
�‰Œ	Ø×Ñ˜Ÿ™›Õ#r   N©r,   ÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r	   Ú	isWindowsr/   r3   r>   r   ÚskipKillÚskipKillReasonrD   rG   rM   © r   r   r   r   #   s    „ ñó2ñ Øˆ×ÑÓØOóò/ó	ð/ó$2ñ Øˆ×ÑÓØTóò2ó	ð2ñ$ ˆH�nÓ%ò&ó &ð&ñ ˆH�nÓ%ò1ó &ð1ô	$r   r   c                  ó€  — e Zd Zdd„Zdd„Z e ej                  «       d«      dd„«       Zdd„Z	dd„Z
dd„Zdd„Zdd	„Z e ej                  «       d
«      dd„«       Z e ej                  «       d«      dd„«       Z	 	 	 	 	 	 dd„Zdd„Z e ej                  «       d«      dd„«       Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ÚLockingTestsc                ó  ‡— dˆfd„}| j                  t        d|«       | j                  «       }t        j                  |«      }| j	                  t
        |j                  «      }| j                  |j                  ‰«       y )Nc                ó   •— t        ‰d «      ‚r"   )r   )ÚsourceÚdestr   s     €r   ÚfakeSymlinkz3LockingTests._symlinkErrorTest.<locals>.fakeSymlink‡   s   ø€ Ü˜% Ó&Ð&r   r   )r\   r+   r]   r+   r,   r   )	r-   r   r   rI   r   r   rJ   r   r   )r   r   r^   ÚlockfrJ   r   s    `    r   Ú_symlinkErrorTestzLockingTests._symlinkErrorTest†   s_   ø€ õ	'ð 	�
‰
”8˜Y¨Ô4à—‘“ˆÜ×&Ñ& uÓ-ˆØ×Ñ¤¨¯©Ó3ˆØ×Ñ˜Ÿ™ EÕ*r   c                óB   — | j                  t        j                  «       y)z†
        An exception raised by C{symlink} other than C{EEXIST} is passed up to
        the caller of L{FilesystemLock.lock}.
        N)r`   r   ÚENOSYSrC   s    r   Útest_symlinkErrorzLockingTests.test_symlinkError‘   s   € ð
 	×ÑœuŸ|™|Õ,r   z9POSIX-specific error propagation not expected on Windows.c                ó€   — | j                  t        j                  «       | j                  t        j                  «       y)a   
        An L{OSError} raised by C{symlink} on a POSIX platform with an errno of
        C{EACCES} or C{EIO} is passed to the caller of L{FilesystemLock.lock}.

        On POSIX, unlike on Windows, these are unexpected errors which cannot
        be handled by L{FilesystemLock}.
        N)r`   r   r8   r$   rC   s    r   Útest_symlinkErrorPOSIXz#LockingTests.test_symlinkErrorPOSIX˜   s(   € ð 	×ÑœuŸ|™|Ô,Ø×ÑœuŸy™yÕ)r   c                óø   — | j                  «       }t        j                  |«      }| j                  |j	                  «       «       | j                  |j
                  «       | j                  |j                  «       y)z‹
        If the lock has never been held, it can be acquired and the C{clean}
        and C{locked} attributes are set to C{True}.
        N)r   r   rI   Ú
assertTruerJ   ÚcleanÚlocked©r   r_   rJ   s      r   Útest_cleanlyAcquirez LockingTests.test_cleanlyAcquire§   sQ   € ð
 —‘“ˆÜ×&Ñ& uÓ-ˆØ�‰˜Ÿ	™	›Ô$Ø�‰˜Ÿ
™
Ô#Ø�‰˜Ÿ™Õ$r   c                ó¶  — | j                  «       }t        j                  |«      }| j                  |j	                  «       «       |j                  «        | j                  |j                  «       t        j                  |«      }| j                  |j	                  «       «       | j                  |j                  «       | j                  |j                  «       y)zŒ
        If a lock is released cleanly, it can be re-acquired and the C{clean}
        and C{locked} attributes are set to C{True}.
        N)	r   r   rI   rg   rJ   ÚunlockrK   ri   rh   rj   s      r   Útest_cleanlyReleasez LockingTests.test_cleanlyRelease²   sŽ   € ð
 —‘“ˆÜ×&Ñ& uÓ-ˆØ�‰˜Ÿ	™	›Ô$Ø�‰ŒØ×Ñ˜Ÿ™Ô%ä×&Ñ& uÓ-ˆØ�‰˜Ÿ	™	›Ô$Ø�‰˜Ÿ
™
Ô#Ø�‰˜Ÿ™Õ$r   c                ó*  — | j                  «       }t        j                  |«      }| j                  |j	                  «       «       t        j                  |«      }| j                  |j	                  «       «       | j                  |j                  «       y)zK
        If a lock is currently locked, it cannot be locked again.
        N)r   r   rI   rg   rJ   rK   ri   )r   r_   Ú	firstLockÚ
secondLocks       r   Útest_cannotLockLockedz"LockingTests.test_cannotLockLockedÂ   sk   € ð —‘“ˆÜ×+Ñ+¨EÓ2ˆ	Ø�‰˜	Ÿ™Ó(Ô)ä×,Ñ,¨UÓ3ˆ
Ø×Ñ˜Ÿ™Ó*Ô+Ø×Ñ˜×*Ñ*Õ+r   c                óö  ‡— dŠdˆfd„}| j                  «       }| j                  t        d|«       t        j                  t	        ‰«      |«       t        j
                  |«      }| j                  |j                  «       «       | j                  |j                  «       | j                  |j                  «       | j                  t        j                  |«      t	        t        j                  «       «      «       y)zÇ
        If a lock was held by a process which no longer exists, it can be
        acquired, the C{clean} attribute is set to C{False}, and the
        C{locked} attribute is set to C{True}.
        i90  c                ó‚   •— |dk7  rt        t        j                  d «      ‚| ‰k(  rt        t        j                  d «      ‚y )Nr   ©r   r   ÚEPERMrF   )ÚpidÚsignalÚowners     €r   ÚfakeKillz4LockingTests.test_uncleanlyAcquire.<locals>.fakeKillÖ   s8   ø€ Ø˜Š{ÜœeŸk™k¨4Ó0Ð0Ø�eŠ|ÜœeŸk™k¨4Ó0Ð0ð r   r@   N©rw   Úintrx   r|   r,   rO   )r   r-   r   r   r+   rI   rg   rJ   rK   rh   ri   r   r1   rA   rB   )r   rz   r_   rJ   ry   s       @r   Útest_uncleanlyAcquirez"LockingTests.test_uncleanlyAcquireÎ   sª   ø€ ð ˆõ	1ð —‘“ˆØ�
‰
”8˜V XÔ.Ü×Ñœ˜U› UÔ+ä×&Ñ& uÓ-ˆØ�‰˜Ÿ	™	›Ô$Ø×Ñ˜Ÿ™Ô$Ø�‰˜Ÿ™Ô$à×Ñœ×*Ñ*¨5Ó1´3´r·y±y³{Ó3CÕDr   c                ó¬  ‡‡— dˆˆfd„}| j                  t        d|«      Šdd„}| j                  t        d|«       | j                  «       Št        j                  ‰«      }t        j                  t        d«      ‰«       | j                  |j                  «       «       | j                  |j                  «       | j                  |j                  «       y)	zð
        If the lock is initially held but then released before it can be
        examined to determine if the process which held it still exists, it is
        acquired and the C{clean} and C{locked} attributes are set to C{True}.
        c                óx   •— t        j                  ‰«       ‰j                  «        t        j                  | «      S r"   )r   ÚrmlinkÚrestorer1   )r   r_   ÚreadlinkPatchs    €€r   ÚfakeReadlinkz?LockingTests.test_lockReleasedBeforeCheck.<locals>.fakeReadlinkî   s,   ø€ ä�O‰O˜EÔ"à×!Ñ!Ô#Ü×$Ñ$ TÓ*Ð*r   r1   c                ó€   — |dk7  rt        t        j                  d «      ‚| dk(  rt        t        j                  d «      ‚y ©Nr   éu¨  ru   ©rw   rx   s     r   rz   z;LockingTests.test_lockReleasedBeforeCheck.<locals>.fakeKill÷   ó7   € Ø˜Š{ÜœeŸk™k¨4Ó0Ð0Ø�eŠ|ÜœeŸk™k¨4Ó0Ð0ð r   r@   r†   N)r   r+   r,   r+   r{   ©
r-   r   r   rI   r   r+   rg   rJ   rh   ri   )r   rƒ   rz   rJ   r_   r‚   s       @@r   Útest_lockReleasedBeforeCheckz)LockingTests.test_lockReleasedBeforeCheckç   s”   ù€ ö	+ð Ÿ
™
¤8¨Z¸ÓFˆó	1ð 	�
‰
”8˜V XÔ.à—‘“ˆÜ×&Ñ& uÓ-ˆÜ×Ñœ˜U› UÔ+Ø�‰˜Ÿ	™	›Ô$Ø�‰˜Ÿ
™
Ô#Ø�‰˜Ÿ™Õ$r   r   c                óø   — dd„}| j                  t        d|«       | j                  «       }t        j                  |«      }| j	                  |j                  «       «       | j	                  |j                  «       y)a“  
        If the lock is released while an attempt is made to acquire
        it, the lock attempt fails and C{FilesystemLock.lock} returns
        C{False}.  This can happen on Windows when L{lockfile.symlink}
        fails with L{IOError} of C{EIO} because another process is in
        the middle of a call to L{os.rmdir} (implemented in terms of
        RemoveDirectory) which is not atomic.
        c                ó6   — t        t        j                  d «      ‚r"   r#   r%   s     r   r^   zGLockingTests.test_lockReleasedDuringAcquireSymlink.<locals>.fakeSymlink  s   € ô œ%Ÿ)™) TÓ*Ð*r   r   Nr*   )r-   r   r   rI   rK   rJ   ri   )r   r^   r_   rJ   s       r   Ú%test_lockReleasedDuringAcquireSymlinkz2LockingTests.test_lockReleasedDuringAcquireSymlink  sZ   € ó	+ð
 	�
‰
”8˜Y¨Ô4à—‘“ˆÜ×&Ñ& uÓ-ˆØ×Ñ˜Ÿ™›Ô%Ø×Ñ˜Ÿ™Õ%r   r4   c                ó6  — dd„}| j                  t        d|«       | j                  «       }t        j                  |«      }t        j                  t        d«      |«       | j                  |j                  «       «       | j                  |j                  «       y)z»
        If the lock is initially held but is released while an attempt
        is made to acquire it, the lock attempt fails and
        L{FilesystemLock.lock} returns C{False}.
        c                ó6   — t        t        j                  d «      ‚r"   r7   ©r   s    r   rƒ   zILockingTests.test_lockReleasedDuringAcquireReadlink.<locals>.fakeReadlink+  s   € ô œ%Ÿ,™,¨Ó-Ð-r   r1   r†   N©r   r+   r,   r   )	r-   r   r   rI   r   r+   rK   rJ   ri   )r   rƒ   r_   rJ   s       r   Ú&test_lockReleasedDuringAcquireReadlinkz3LockingTests.test_lockReleasedDuringAcquireReadlink   sn   € ó	.ð 	�
‰
”8˜Z¨Ô6à—‘“ˆÜ×&Ñ& uÓ-ˆÜ×Ñœ˜U› UÔ+Ø×Ñ˜Ÿ™›Ô%Ø×Ñ˜Ÿ™Õ%r   c                ór  ‡‡— dˆˆfd„}| j                  t        d|«       | j                  «       }t        j                  t	        d«      |«       t        j
                  |«      }| j                  ‰|j                  «      }| j                  |j                  ‰«       | j                  |j                  «       y )Nc                ó   •—  ‰‰d «      ‚r"   rW   )r   r   ÚexceptionTypes    €€r   rƒ   z5LockingTests._readlinkErrorTest.<locals>.fakeReadlink<  s   ø€ Ù  tÓ,Ð,r   r1   r†   r‘   )r-   r   r   r   r+   rI   r   rJ   r   r   rK   ri   )r   r•   r   rƒ   r_   rJ   r   s    ``    r   Ú_readlinkErrorTestzLockingTests._readlinkErrorTest9  s‡   ù€ ö	-ð 	�
‰
”8˜Z¨Ô6à—‘“ˆô 	×Ñœ˜U› UÔ+ä×&Ñ& uÓ-ˆØ×Ñ ¨t¯y©yÓ9ˆØ×Ñ˜Ÿ™ EÔ*Ø×Ñ˜Ÿ™Õ%r   c                ó”   — | j                  t        t        j                  «       | j                  t        t        j                  «       y)z‡
        An exception raised by C{readlink} other than C{ENOENT} is passed up to
        the caller of L{FilesystemLock.lock}.
        N)r–   r   r   rb   r.   rC   s    r   Útest_readlinkErrorzLockingTests.test_readlinkErrorK  s,   € ð
 	×Ñ¤¬¯©Ô6Ø×Ñ¤¬¯©Õ6r   c                ó”   — | j                  t        t        j                  «       | j                  t        t        j                  «       y)zú
        Any L{IOError} raised by C{readlink} on a POSIX platform passed to the
        caller of L{FilesystemLock.lock}.

        On POSIX, unlike on Windows, these are unexpected errors which cannot
        be handled by L{FilesystemLock}.
        N)r–   r.   r   rb   r8   rC   s    r   Útest_readlinkErrorPOSIXz$LockingTests.test_readlinkErrorPOSIXS  s,   € ð 	×Ñ¤¬¯©Ô6Ø×Ñ¤¬¯©Õ6r   c                ó¬  ‡‡— dˆˆfd„}| j                  t        d|«      Šdd„}| j                  t        d|«       | j                  «       Št        j                  ‰«      }t        j                  t        d«      ‰«       | j                  |j                  «       «       | j                  |j                  «       | j                  |j                  «       y)	z×
        If a second process cleans up the lock after a first one checks the
        lock and finds that no process is holding it, the first process does
        not fail when it tries to clean up the lock.
        c                óx   •— ‰j                  «        t        j                  ‰«       t        j                  | «      S r"   )r�   r   r€   )r   r_   ÚrmlinkPatchs    €€r   Ú
fakeRmlinkz?LockingTests.test_lockCleanedUpConcurrently.<locals>.fakeRmlinki  s*   ø€ Ø×ÑÔ!ä�O‰O˜EÔ"ä—?‘? 4Ó(Ð(r   r€   c                ó€   — |dk7  rt        t        j                  d «      ‚| dk(  rt        t        j                  d «      ‚y r…   ru   r‡   s     r   rz   z=LockingTests.test_lockCleanedUpConcurrently.<locals>.fakeKillr  rˆ   r   r@   r†   N)r   r+   r,   rO   r{   r‰   )r   rž   rz   rJ   r_   r�   s       @@r   Útest_lockCleanedUpConcurrentlyz+LockingTests.test_lockCleanedUpConcurrentlyb  s”   ù€ ö	)ð —j‘j¤¨8°ZÓ@ˆó	1ð 	�
‰
”8˜V XÔ.à—‘“ˆÜ×&Ñ& uÓ-ˆÜ×Ñœ˜U› UÔ+Ø�‰˜Ÿ	™	›Ô$Ø�‰˜Ÿ
™
Ô#Ø�‰˜Ÿ™Õ$r   c                óÂ  — dd„}| j                  t        d|«       dd„}| j                  t        d|«       | j                  «       }t        j                  t	        d«      |«       t        j
                  |«      }| j                  t        |j                  «      }| j                  |j                  t        j                  «       | j                  |j                  «       y)	z…
        An exception raised by L{rmlink} other than C{ENOENT} is passed up
        to the caller of L{FilesystemLock.lock}.
        c                ó6   — t        t        j                  d «      ‚r"   )r   r   rb   r�   s    r   rž   z1LockingTests.test_rmlinkError.<locals>.fakeRmlink‡  r<   r   r€   c                ó€   — |dk7  rt        t        j                  d «      ‚| dk(  rt        t        j                  d «      ‚y r…   ru   r‡   s     r   rz   z/LockingTests.test_rmlinkError.<locals>.fakeKillŒ  rˆ   r   r@   r†   Nr‘   r{   )r-   r   r   r   r+   rI   r   r   rJ   r   r   rb   rK   ri   )r   rž   rz   r_   rJ   r   s         r   Útest_rmlinkErrorzLockingTests.test_rmlinkError�  s¡   € ó	.ð 	�
‰
”8˜X zÔ2ó	1ð 	�
‰
”8˜V XÔ.à—‘“ˆô 	×Ñœ˜U› UÔ+ä×&Ñ& uÓ-ˆØ×Ñ¤¨¯©Ó3ˆØ×Ñ˜Ÿ™¤E§L¡LÔ1Ø×Ñ˜Ÿ™Õ%r   c                óŒ  — dd„}| j                  t        d|«       | j                  «       }t        j                  t	        d«      |«       t        j
                  |«      }| j                  t        |j                  «      }| j                  |j                  t        j                  «       | j                  |j                  «       y)z¶
        If L{kill} raises an exception other than L{OSError} with errno set to
        C{ESRCH}, the exception is passed up to the caller of
        L{FilesystemLock.lock}.
        c                ó6   — t        t        j                  d «      ‚r"   )r   r   rv   r‡   s     r   rz   z-LockingTests.test_killError.<locals>.fakeKill¥  s   € Üœ%Ÿ+™+ tÓ,Ð,r   r@   r†   N)rw   r|   rx   r|   r,   r   )r-   r   r   r   r+   rI   r   r   rJ   r   r   rv   rK   ri   )r   rz   r_   rJ   r   s        r   Útest_killErrorzLockingTests.test_killErrorž  sŠ   € ó	-ð 	�
‰
”8˜V XÔ.à—‘“ˆô 	×Ñœ˜U› UÔ+ä×&Ñ& uÓ-ˆØ×Ñ¤¨¯©Ó3ˆØ×Ñ˜Ÿ™¤E§K¡KÔ0Ø×Ñ˜Ÿ™Õ%r   c                óö   — | j                  «       }t        j                  t        t	        j
                  «       dz   «      |«       t        j                  |«      }| j                  t        |j                  «       y)z‚
        L{FilesystemLock.unlock} raises L{ValueError} if called for a lock
        which is held by a different process.
        é   N)
r   r   r   r+   rA   rB   rI   r   Ú
ValueErrorrm   rj   s      r   Útest_unlockOtherzLockingTests.test_unlockOther´  sR   € ð
 —‘“ˆÜ×ÑœœRŸY™Y›[¨1™_Ó-¨uÔ5Ü×&Ñ& uÓ-ˆØ×Ñœ* d§k¡kÕ2r   c                ó„  — | j                  «       }| j                  t        j                  |«      «       t        j                  |«      }| j                  |j                  «       «       | j                  t        j                  |«      «       |j                  «        | j                  t        j                  |«      «       y)zp
        L{isLocked} returns C{True} if the named lock is currently locked,
        C{False} otherwise.
        N)r   rK   r   ÚisLockedrI   rg   rJ   rm   rj   s      r   Útest_isLockedzLockingTests.test_isLocked¾  sƒ   € ð
 —‘“ˆØ×Ñœ×*Ñ*¨5Ó1Ô2Ü×&Ñ& uÓ-ˆØ�‰˜Ÿ	™	›Ô$Ø�‰œ×)Ñ)¨%Ó0Ô1Ø�‰ŒØ×Ñœ×*Ñ*¨5Ó1Õ2r   N)r   r|   r,   rO   rN   )r•   ztype[OSError] | type[IOError]r   r|   r,   rO   )rP   rQ   rR   r`   rc   r   r	   rT   re   rk   rn   rr   r}   rŠ   r   r�   r’   r–   r˜   rš   r    r¤   r§   r«   r®   rW   r   r   rY   rY   …   s	  „ ó	+ó-ñ Øˆ×ÑÓØCóò	*ó	ð	*ó	%ó%ó 
,óEó2%ñ> Øˆ×ÑÓØOóò&ó	ð&ñ, Øˆ×ÑÓØTóò&ó	ð&ð*&Ø:ð&ØCFð&à	ó&ó$7ñ Øˆ×ÑÓØCóò	7ó	ð	7ó%ó>&ó:&ó,3ô3r   rY   )rS   Ú
__future__r   r   rA   Úunittestr   r   Útypingr   Útwisted.pythonr   Útwisted.python.reflectr   Útwisted.python.runtimer	   Útwisted.trial.unittestr
   rU   rV   rT   r   rY   rW   r   r   ú<module>r¶      s‚   ðñ
õ #ã Û 	ß 'å å #Ý 0Ý +Ý +à€Ø€Ø€8×ÑÔáÐ,Ó-Ð5Ù˜,Ó'Ð/àˆð<ð 	ô_$�ô _$ôDD3�8õ D3r   