ó
    ×›‘hì2  ã                   ó®  • S r SSKrSSKrSSKr SSKrSSKJr  SSKJ	r	J
r
  SSKJrJr  SSKJrJr  SSKJrJrJrJrJrJrJrJrJrJrJr  SSKJr  SS	KJ r   SS
K!J"r"  \" \	RF                  RI                  \
5      (       + S5       " S S\"5      5       r%\" \	RF                  RI                  \
5      (       + S5       " S S\"5      5       r&g! \ a    Sr N¿f = f)z
Whitebox tests for TCP APIs.
é    N)ÚskipIf)Ú
interfacesÚreactor)ÚgatherResultsÚmaybeDeferred)ÚProtocolÚServerFactory)Ú_ACCEPT_ERRORSÚEAGAINÚECONNABORTEDÚEINPROGRESSÚEMFILEÚENFILEÚENOBUFSÚENOMEMÚEPERMÚEWOULDBLOCKÚPort)Úlog)Úplatform)ÚTestCasez?This test only applies to reactors that implement IReactorFDsetc                   óp   • \ rS rSrSrSrS rS rS r\	" \
R                  " 5       S:H  S5      S	 5       rS
rg)ÚPlatformAssumptionsTestsé)   z,
Test assumptions about platform behaviors.
i    c                 ó   • / U l         [        b€  SSKJn  [	        U" 5       5      S-   n[        R
                  " [        R                  5      U l        [        R                  " [        R                  X R                  S   45        US-   U l	        g g )Nr   )Ú_listOpenFDsé   é   éd   )
ÚopenSocketsÚresourceÚtwisted.internet.processr   ÚlenÚ	getrlimitÚRLIMIT_NOFILEÚoriginalFileLimitÚ	setrlimitÚsocketLimit)Úselfr   ÚnewLimits      ÚcC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/test/test_tcp_internals.pyÚsetUpÚPlatformAssumptionsTests.setUp4   sy   € ØˆÔÜÑõ >ä™<›>Ó*¨QÑ.ˆHÜ%-×%7Ò%7¼×8NÑ8NÓ%OˆDÔ"Ü×ÒÜ×&Ñ&¨×3IÑ3IÈ!Ñ3LÐ(Môð  (¨#™~ˆDÕð  ó    c                 óx  • U R                   (       a;  U R                   R                  5       R                  5         U R                   (       a  M;  [        bg  [        R                  " [        R
                  5      S   n[        U R                  S   U5      n[        R                  " [        R
                  X!45        g g )Nr   r   )	r    ÚpopÚcloser!   r$   r%   Úminr&   r'   )r)   ÚcurrentHardLimitÚnewSoftLimits      r+   ÚtearDownÚ!PlatformAssumptionsTests.tearDownF   sŽ   € Ø××Ø×Ñ× Ñ Ó"×(Ñ(Ô*ð ××ÑäÑô
  (×1Ò1´(×2HÑ2HÓIÈ!ÑLÐÜ˜t×5Ñ5°aÑ8Ð:JÓKˆLÜ×Òœx×5Ñ5¸Ð7WÕXð  r.   c                 óf   • [         R                   " 5       nU R                  R                  U5        U$ )zd
Create and return a new socket object, also tracking it so it can be
closed in the test tear down.
)Úsocketr    Úappend)r)   Úss     r+   r8   ÚPlatformAssumptionsTests.socketR   s(   € ô
 �MŠM‹OˆØ×Ñ×Ñ Ô"Øˆr.   Úwin32zhWindows requires an unacceptably large amount of resources to provoke this behavior in the naive manner.c                 ó²  • U R                  5       nUR                  S5        UR                  5       S   nUR                  S5        U R                  5       nUR	                  S5        [        U R                  5       H  n U R                  5         M     U R                  S5        U R                  UR                  SU45      S[        45        U R                  [         R                   UR"                  5      nU R                  UR                  S   [        [        45        g! [         a*  nUR                  S   [        [        4;   a   SnA  M«  e SnAff = f)	z€
Test that the platform accept(2) call fails with either L{EMFILE} or
L{ENOBUFS} when there are too many file descriptors open.
)ú	127.0.0.1r   r   é   Fr   Nz7Could provoke neither EMFILE nor ENOBUFS from platform.r>   )r8   ÚbindÚgetsocknameÚlistenÚsetblockingÚranger(   ÚOSErrorÚargsr   r   ÚfailÚassertInÚ
connect_exr   ÚassertRaisesÚerrorÚaccept)r)   ÚportÚserverPortNumberÚclientÚiÚeÚexcs          r+   Útest_acceptOutOfFilesÚ.PlatformAssumptionsTests.test_acceptOutOfFiles[   s  € ð �{‰{‹}ˆØ�	‰	Ð"Ô#Ø×+Ñ+Ó-¨aÑ0ÐØ�‰�AŒð —‘“ˆØ×Ñ˜5Ô!ô �t×'Ñ'Ö(ˆAðØ—‘–ñ )ð �I‰IÐOÔPð 	�‰Ø×Ñ˜{Ð,<Ð=Ó>ÀÄKÐ@Pô	
ð
 ×Ñ¤§¡¨d¯k©kÓ:ˆØ�‰�c—h‘h˜q‘k¤F¬GÐ#4Õ5øô% ó Ø—6‘6˜!‘9¤¬Ð 1Ó1æð ûðús   Â D"Ä"
EÄ,EÅEÅE)r    r&   r(   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r(   r,   r5   r8   r   r   ÚgetTyperS   Ú__static_attributes__© r.   r+   r   r   )   sM   † ñ
ð €Kò.ò$
Yòñ Ø×ÒÓ˜gÑ%ð	5óñ
%6óó
%6r.   r   c                   ód  • \ rS rSrSrS rS rS rS rS r	S r
S	 r\" \R                  " 5       S
:H  S5      S 5       r\" \R                  " 5       S
:H  S5      S 5       r\" \R$                  R'                  S5      S:H  S5      S 5       r\" \R                  " 5       S
:H  S5      S 5       rS rSrg)ÚSelectReactorTestséˆ   z/
Tests for select-specific failure conditions.
c                 ót   • / U l         / U l        [        R                  " U R                  R                  5        g ©N)ÚportsÚmessagesr   ÚaddObserverr9   ©r)   s    r+   r,   ÚSelectReactorTests.setUp‘   s&   € ØˆŒ
ØˆŒÜ�Š˜Ÿ™×,Ñ,Õ-r.   c                 óÒ   • [         R                  " U R                  R                  5        [	        U R
                   Vs/ s H  n[        UR                  5      PM     sn5      $ s  snf ra   )r   ÚremoveObserverrc   r9   r   rb   r   ÚstopListening)r)   Úps     r+   r5   ÚSelectReactorTests.tearDown–   sD   € Ü×Ò˜4Ÿ=™=×/Ñ/Ô0ÜÀdÇjÂjÓQÂjÀœm¨A¯O©OÖ<ÁjÑQÓRÐRùÒQs   ¾A$c                 óp   • [        XUS9nUR                  5         U R                  R                  U5        U$ )zg
Create, start, and return a new L{Port}, also tracking it so it can
be stopped in the test tear down.
©Ú	interface)r   ÚstartListeningrb   r9   )r)   Ú
portNumberÚfactoryrn   rj   s        r+   rM   ÚSelectReactorTests.portš   s3   € ô
 �°	Ñ:ˆØ	×ÑÔØ�
‰
×Ñ˜!ÔØˆr.   c                 óÀ  ^•  " U4S jS5      n[        5       nU R                  SUSS9nU R                  USU" 5       5        UR                  5         Sn[        R
                  T   nU R                   Vs/ s H2  nUR                  S5      U:H  =(       a    UR                  S	5      U:H  PM4     nnU R                  [        U5      SS
U R                  < 35        gs  snf )aj  
Test behavior in the face of an exception from C{accept(2)}.

On any exception which indicates the platform is unable or unwilling
to allocate further resources to us, the existing port should remain
listening, a message should be logged, and the exception should not
propagate outward from doRead.

@param socketErrorNumber: The errno to simulate from accept.
c                   ó&   >• \ rS rSrSrU 4S jrSrg)Ú9SelectReactorTests._acceptFailureTest.<locals>.FakeSocketé°   z1
Pretend to be a socket in an overloaded system.
c                 óD   >• [        T[        R                  " T5      5      era   )rE   ÚosÚstrerror)r)   ÚsocketErrorNumbers    €r+   rL   Ú@SelectReactorTests._acceptFailureTest.<locals>.FakeSocket.acceptµ   s   ø€ ÜÐ/´·²Ð=NÓ1OÓPÐPr.   r\   N©rU   rV   rW   rX   rY   rL   r[   )rz   s   €r+   Ú
FakeSocketru   °   s   ø† ñ÷Qð Qr.   r}   r   r>   rm   r8   z/Could not accept new connection ({acceptError})Ú
log_formatÚacceptErrorz)Log event for failed accept not found in N)
r	   rM   ÚpatchÚdoReadÚerrnoÚ	errorcoderc   ÚgetÚassertGreaterr#   )	r)   rz   r}   rq   rM   ÚexpectedFormatÚexpectedErrorCodeÚmsgÚmatchingMessagess	    `       r+   Ú_acceptFailureTestÚ%SelectReactorTests._acceptFailureTest¤   sÝ   ø€ ÷	Qô 	Qô  “/ˆØ�y‰y˜˜G¨{ˆyÐ;ˆØ�
‰
�4˜¡:£<Ô0à�‰ŒàJˆÜ!ŸO™OÐ,=Ñ>Ðð —}’}ó
ò
 %�ð —‘˜Ó%¨Ñ7÷ @Ø—G‘G˜MÓ*Ð.?Ñ?ò@ñ %ð 	ð 
ð 	×ÑÜÐ Ó!ÙØ@DÇÃÐOõ	
ùò
s   Á59Cc                 ó,   • U R                  [        5      $ )zú
C{accept(2)} can fail with C{EMFILE} when there are too many open file
descriptors in the process.  Test that this doesn't negatively impact
any other existing connections.

C{EMFILE} mainly occurs on Linux when the open file rlimit is
encountered.
)rŠ   r   re   s    r+   Útest_tooManyFilesFromAcceptÚ.SelectReactorTests.test_tooManyFilesFromAcceptÍ   ó   € ð ×&Ñ&¤vÓ.Ð.r.   c                 ó,   • U R                  [        5      $ )zÎ
Similar to L{test_tooManyFilesFromAccept}, but test the case where
C{accept(2)} fails with C{ENOBUFS}.

This mainly occurs on Windows and FreeBSD, but may be possible on
Linux and other platforms as well.
)rŠ   r   re   s    r+   Útest_noBufferSpaceFromAcceptÚ/SelectReactorTests.test_noBufferSpaceFromAcceptØ   s   € ð ×&Ñ&¤wÓ/Ð/r.   c                 ó,   • U R                  [        5      $ )zÑ
Similar to L{test_tooManyFilesFromAccept}, but test the case where
C{accept(2)} fails with C{ECONNABORTED}.

It is not clear whether this is actually possible for TCP
connections on modern versions of Linux.
)rŠ   r   re   s    r+   Ú test_connectionAbortedFromAcceptÚ3SelectReactorTests.test_connectionAbortedFromAcceptâ   s   € ð ×&Ñ&¤|Ó4Ð4r.   r<   z(Windows accept(2) cannot generate ENFILEc                 ó,   • U R                  [        5      $ )z¸
Similar to L{test_tooManyFilesFromAccept}, but test the case where
C{accept(2)} fails with C{ENFILE}.

This can occur on Linux when the system has exhausted (!) its supply
of inodes.
)rŠ   r   re   s    r+   Útest_noFilesFromAcceptÚ)SelectReactorTests.test_noFilesFromAcceptì   r�   r.   z(Windows accept(2) cannot generate ENOMEMc                 ó,   • U R                  [        5      $ )as  
Similar to L{test_tooManyFilesFromAccept}, but test the case where
C{accept(2)} fails with C{ENOMEM}.

On Linux at least, this can sensibly occur, even in a Python program
(which eats memory like no ones business), when memory has become
fragmented or low memory has been filled (d_alloc calls
kmem_cache_alloc calls kmalloc - kmalloc only allocates out of low
memory).
)rŠ   r   re   s    r+   Útest_noMemoryFromAcceptÚ*SelectReactorTests.test_noMemoryFromAccept÷   s   € ð ×&Ñ&¤vÓ.Ð.r.   ÚINFRASTRUCTUREÚAZUREPIPELINESz(Hangs on Azure Pipelines due to firewallc                 ó6  ^^• [        5       n[        Ul        U R                  SUSS9mU R	                  TR
                  5        / mU4S jnU R	                  U5        U4S jnTR                  U" 5       5        STl        TR                  5         U R                  TR                  S5        TR                  U" 5       5        TR                  5         U R                  TR                  S5        TR                  5         U R                  TR                  S5        g)zÈ
L{tcp.Port.doRead} increases the number of consecutive
C{accept} calls it performs if all of the previous C{accept}
calls succeed; otherwise, it reduces the number to the amount
of successful calls.
r   r>   rm   c                  ó8   >• T H  n U R                  5         M     g ra   )r1   )rO   Úclientss    €r+   ÚcloseAllÚ7SelectReactorTests.test_acceptScaling.<locals>.closeAll  s   ø€ Û!�Ø—‘–ò "r.   c                  óÄ   >• [         R                   " [         R                  [         R                  5      n U R                  STR	                  5       R
                  45        U $ )Nr>   )r8   ÚAF_INETÚSOCK_STREAMÚconnectÚgetHostrM   )rO   rM   s    €r+   r¦   Ú6SelectReactorTests.test_acceptScaling.<locals>.connect  s?   ø€ Ü—]’]¤6§>¡>´6×3EÑ3EÓFˆFØ�N‰N˜K¨¯©«×)<Ñ)<Ð=Ô>ØˆMr.   r   N)r	   r   ÚprotocolrM   Ú
addCleanupri   r9   ÚnumberAcceptsr�   r…   ÚassertEqual)r)   rq   r¡   r¦   r    rM   s       @@r+   Útest_acceptScalingÚ%SelectReactorTests.test_acceptScaling  sÞ   ù€ ô  “/ˆÜ#ˆÔØ�y‰y˜˜G¨{ˆyÐ;ˆØ�‰˜×*Ñ*Ô+àˆõ	ð 	�‰˜Ô!õ	ð
 	�‰‘w“yÔ!ØˆÔØ�‰ŒØ×Ñ˜4×-Ñ-¨qÔ1à�‰‘w“yÔ!Ø�‰Œð 	×Ñ˜×+Ñ+¨QÔ/à�‰Œð 	×Ñ˜×+Ñ+¨QÕ/r.   z'Windows accept(2) cannot generate EPERMc                 óÜ  ^ ^^• SmS/m " UUU 4S jS5      n[        T5       H2  nT R                  [        R                  U" 5       R                  5        M4     T R                  T R
                  U" 5       R                  5        S/m[        5       nT R                  SUSS9nSUl        T R                  USU" 5       5        UR                  5         T R                  UR                  S5        g	)
z›
C{accept(2)} returning C{EPERM} is treated as a transient
failure and the call retried no more than the maximum number
of consecutive C{accept(2)} calls.
é{   r   c                   ó*   >• \ rS rSrSrU UU4S jrSrg)ÚLSelectReactorTests.test_permissionFailure.<locals>.FakeSocketWithAcceptLimiti<  ú{
Pretend to be a socket in an overloaded system whose
C{accept} method can only be called
C{maximumNumberOfAccepts} times.
c                 ó¢   >• TS==   S-  ss'   TS   T:”  a  TR                  S5        [        [        [        R                  " [        5      5      e)Nr   r   z(Maximum number of accept calls exceeded.)rG   rE   r   rx   ry   )ÚoselfÚacceptCallsÚmaximumNumberOfAcceptsr)   s    €€€r+   rL   ÚSSelectReactorTests.test_permissionFailure.<locals>.FakeSocketWithAcceptLimit.acceptC  sA   ø€ Ø˜A“ !Ñ#“Ø˜q‘>Ð$:Ó:Ø—I‘IÐHÔIÜœe¤R§[¢[´Ó%7Ó8Ð8r.   r\   Nr|   )r¶   r·   r)   s   €€€r+   ÚFakeSocketWithAcceptLimitr²   <  s   ø† ñ÷9ò 9r.   r¹   r>   rm   r8   r   N)rD   rJ   r8   rK   rL   ÚfailureExceptionr	   rM   r«   r€   r�   ÚassertEquals)r)   r¹   Ú_rq   rM   r¶   r·   s   `    @@r+   Útest_permissionFailureÚ)SelectReactorTests.test_permissionFailure2  sÏ   ú€ ð "%ÐØ�cˆ÷	9ö 	9ô Ð-Ö.ˆAØ×ÑœfŸl™lÑ,EÓ,G×,NÑ,NÖOñ /ð 	×Ñ˜$×/Ñ/Ñ1JÓ1L×1SÑ1SÔTà�cˆä“/ˆØ�y‰y˜˜G¨{ˆyÐ;ˆØ ˆÔØ�
‰
�4˜Ñ#<Ó#>Ô?ð 	�‰Œð 	×Ñ˜$×,Ñ,¨aÕ0r.   c                 óú  ^• [        [        5      nUR                  [        [        [
        /5        [        S U 5       5      S-   m " U4S jS5      n[        5       nU R                  SUSS9nU R                  USU" 5       5        UR                  5         U R                  [        R                  5      nU R                  S[        U5      5        U R                  US   R                   R"                  S   T5        g	)
ze
A C{socket.error} raised by C{accept(2)} whose C{errno} is
unknown to the recovery logic is logged.
c              3   óT   #   • U  H  n[        U[        5      (       d  M  Uv •  M      g 7fra   )Ú
isinstanceÚint)Ú.0rK   s     r+   Ú	<genexpr>ÚBSelectReactorTests.test_unknownSocketErrorRaise.<locals>.<genexpr>g  s   é € ÐI¢;˜%´*¸UÄC×2H—‘¢;ùs   ‚(Ÿ	(r   c                   ó&   >• \ rS rSrSrU 4S jrSrg)ÚYSelectReactorTests.test_unknownSocketErrorRaise.<locals>.FakeSocketWithUnknownAcceptErrorij  r³   c                 ó   >• [        TS5      e)Nzunknown socket error message)rE   )rµ   ÚunknownAcceptErrors    €r+   rL   Ú`SelectReactorTests.test_unknownSocketErrorRaise.<locals>.FakeSocketWithUnknownAcceptError.acceptq  s   ø€ ÜÐ0Ð2PÓQÐQr.   r\   Nr|   )rÉ   s   €r+   Ú FakeSocketWithUnknownAcceptErrorrÇ   j  s   ø† ñ÷Rð Rr.   rË   r   r>   rm   r8   N)Úlistr
   Úextendr   r   r   Úmaxr	   rM   r€   r�   ÚflushLoggedErrorsr8   rK   r¬   r#   ÚvaluerF   )r)   ÚknownErrorsrË   rq   rM   ÚfailuresrÉ   s         @r+   Útest_unknownSocketErrorRaiseÚ/SelectReactorTests.test_unknownSocketErrorRaise^  sÒ   ø€ ô
 œ>Ó*ˆØ×ÑœF¤E¬;Ð7Ô8ô ÑI¡;ÓIÓIÈAÑMð 	÷	Rô 	Rô  “/ˆØ�y‰y˜˜G¨{ˆyÐ;ˆØ�
‰
�4˜Ñ#CÓ#EÔFà�‰Œà×)Ñ)¬&¯,©,Ó7ˆØ×Ñ˜œC ›MÔ*Ø×Ñ˜ !™×*Ñ*×/Ñ/°Ñ2Ð4FÕGr.   )rc   rb   N)rU   rV   rW   rX   rY   r,   r5   rM   rŠ   r�   r‘   r”   r   r   rZ   r—   rš   rx   Úenvironr„   r­   r½   rÓ   r[   r\   r.   r+   r^   r^   ˆ   sè   † ñ
ò.ò
Sòò'
òR	/ò0ò5ñ ˆH×ÒÓ 'Ñ)Ð+UÓVñ/ó Wð/ñ ˆH×ÒÓ 'Ñ)Ð+UÓVñ/ó Wð/ñ Ø
�
‰
�‰Ð'Ó(Ð,<Ñ<Ø2óñ'0ó	ð'0ñR ˆH×ÒÓ 'Ñ)Ð+TÓUñ)1ó Vð)1õVHr.   r^   )'rY   r‚   rx   r8   r!   ÚImportErrorÚunittestr   Útwisted.internetr   r   Útwisted.internet.deferr   r   Útwisted.internet.protocolr   r	   Útwisted.internet.tcpr
   r   r   r   r   r   r   r   r   r   r   Útwisted.pythonr   Útwisted.python.runtimer   Útwisted.trial.unittestr   ÚIReactorFDSetÚ
providedByr   r^   r\   r.   r+   Ú<module>rá      sß   ðñó
 Û 	Û ðÛõ ç 0ß ?ß =÷÷ ÷ ñ õ Ý +Ý +ñ Ø× Ñ ×+Ñ+¨GÓ4Ô4ØEóôX6˜xó X6ó	ðX6ñv Ø× Ñ ×+Ñ+¨GÓ4Ô4ØEóôpH˜ó pHó	ñpHøð{ ó Ø‚Hðús   �C	 Ã	CÃC