+
    üÐjì2  ã                   ó²  € R t ^ RIt^ RIt^ RIt ^ RIt^ RIHt ^ RIH	t	H
t
 ^ RIHtHt ^ RIHtHt ^ RIHtHtHtHtHtHtHtHtHtHtHt ^ RIHt ^ RIH t  ^ R	I!H"t" ]! ]	PF                  PI                  ]
4      '       * R
4       ! R R]"4      4       t%]! ]	PF                  PI                  ]
4      '       * R
4       ! R R]"4      4       t&R#   ] d    Rt LÁi ; i)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                   ó|   a € ] tR t^)t o RtRtR tR tR t]	! ]
P                  ! 4       R8H  R4      R 4       tR	tV tR
# )ÚPlatformAssumptionsTestsz,
Test assumptions about platform behaviors.
i    c                ó>  € . V n         \        eŽ   ^ RIHp \	        V! 4       4      ^,           p\        P
                  ! \        P                  4      V n        \        P                  ! \        P                  W P                  ^,          34       V^d,           V n	        R # R # )N)Ú_listOpenFDs)
ÚopenSocketsÚresourceÚtwisted.internet.processr   ÚlenÚ	getrlimitÚRLIMIT_NOFILEÚoriginalFileLimitÚ	setrlimitÚsocketLimit)Úselfr   ÚnewLimits   &  ÚA/usr/lib/python3/dist-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                ón  € V P                   '       d+   V P                   P                  4       P                  4        K<  \        eq   \        P                  ! \        P
                  4      ^,          p\        V P                  ^ ,          V4      p\        P                  ! \        P
                  W!34       R # R # ©N)	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   € \         P                   ! 4       pV P                  P                  V4       V# )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&   r4   ÚPlatformAssumptionsTests.socketR   s(   € ô
 �MŠM‹OˆØ×Ñ×Ñ Ô"Øˆr)   Úwin32zhWindows requires an unacceptably large amount of resources to provoke this behavior in the naive manner.c                óÐ  € V P                  4       pVP                  R4       VP                  4       ^,          pVP                  ^4       V P                  4       pVP	                  R4       \        V P                  4       F  p V P                  4        K  	  V P                  R4       V P                  VP                  RV34      ^ \        34       V P                  \         P                   VP"                  4      pV P                  VP                  ^ ,          \        \        34       R#   \         d0   pTP                  ^ ,          \        \        39   d    Rp? K¶  h Rp?ii ; i)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.1FNz7Could provoke neither EMFILE nor ENOBUFS from platform.)r:   é    )r4   Ú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%Ä6"E ÅE Å E%)r   r!   r#   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r#   r'   r1   r4   r   r   ÚgetTyperO   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r&   r   r   )   sP   ø‡ € ñ
ð €Kò.ò$
Yòñ Ø×ÒÓ˜gÑ%ð	5óñ
%6óö
%6r)   r   c                   óp  a € ] tR t^ˆt o RtR tR tR tR tR t	R t
R t]! ]P                  ! 4       R	8H  R
4      R 4       t]! ]P                  ! 4       R	8H  R4      R 4       t]! ]P$                  P'                  R4      R8H  R4      R 4       t]! ]P                  ! 4       R	8H  R4      R 4       tR tRtV tR# )ÚSelectReactorTestsz/
Tests for select-specific failure conditions.
c                óv   € . V n         . V n        \        P                  ! V P                  P                  4       R # r+   )ÚportsÚmessagesr   ÚaddObserverr5   ©r$   s   &r&   r'   ÚSelectReactorTests.setUp‘   s&   € ØˆŒ
ØˆŒÜ�Š˜Ÿ™×,Ñ,Ö-r)   c                óÐ   € \         P                  ! V P                  P                  4       \	        V P
                   Uu. uF  p\        VP                  4      NK  	  up4      # u upi r+   )r   ÚremoveObserverr_   r5   r   r^   r   ÚstopListening)r$   Úps   & r&   r1   ÚSelectReactorTests.tearDown–   sD   € Ü×Ò˜4Ÿ=™=×/Ñ/Ô0ÜÀdÇjÂjÓQÁjÀœm¨A¯O©OÖ<ÁjÑQÓRÐRùÒQs   ¾A#c                óv   € \        WVR7      pVP                  4        V P                  P                  V4       V# )zg
Create, start, and return a new L{Port}, also tracking it so it can
be stopped in the test tear down.
©Ú	interface)r   ÚstartListeningr^   r5   )r$   Ú
portNumberÚfactoryrj   rf   s   &&&& r&   rI   ÚSelectReactorTests.portš   s3   € ô
 �°	Ô:ˆØ	×ÑÔØ�
‰
×Ñ˜!ÔØˆr)   c                óÐ  a€  ! V3R lR4      p\        4       pV P                  ^ VRR7      pV P                  VRV! 4       4       VP                  4        Rp\        P
                  S,          pV P                   Uu. uF3  pVP                  R4      V8H  ;'       d    VP                  R4      V8H  NK5  	  ppV P                  \        V4      ^ R	V P                  : 24       R
# u upi )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                   ó2   <a € ] tR t^°t o RtV3R ltRtV tR# )Ú9SelectReactorTests._acceptFailureTest.<locals>.FakeSocketz1
Pretend to be a socket in an overloaded system.
c                óD   <€ \        S\        P                  ! S4      4      hr+   )rA   ÚosÚstrerror)r$   ÚsocketErrorNumbers   &€r&   rH   Ú@SelectReactorTests._acceptFailureTest.<locals>.FakeSocket.acceptµ   s   ø€ ÜÐ/´·²Ð=NÓ1OÓPÐPr)   © N©rQ   rR   rS   rT   rU   rH   rW   rX   )rZ   ru   s   @€r&   Ú
FakeSocketrq   °   s   ù‡ € ñ÷Qó Qr)   ry   r:   ri   r4   z/Could not accept new connection ({acceptError})Ú
log_formatÚacceptErrorz)Log event for failed accept not found in N)
r   rI   ÚpatchÚdoReadÚerrnoÚ	errorcoder_   ÚgetÚassertGreaterr   )	r$   ru   ry   rm   rI   ÚexpectedFormatÚexpectedErrorCodeÚmsgÚmatchingMessagess	   &f       r&   Ú_acceptFailureTestÚ%SelectReactorTests._acceptFailureTest¤   sã   ø€ ÷	Qô 	Qô  “/ˆØ�y‰y˜˜G¨{ˆyÓ;ˆØ�
‰
�4˜¡:£<Ô0à�‰ŒàJˆÜ!ŸO™OÐ,=Õ>Ðð —}’}ó
ñ
 %�ð —‘˜Ó%¨Ñ7÷ @ð @Ø—G‘G˜MÓ*Ð.?Ñ?ò@ñ %ð 	ð 
ð 	×ÑÜÐ Ó!ÙØ@DÇÃÐOö	
ùò
s   Á<C#ÂC#c                ó,   € V P                  \        4      # )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   ra   s   &r&   Útest_tooManyFilesFromAcceptÚ.SelectReactorTests.test_tooManyFilesFromAcceptÍ   ó   € ð ×&Ñ&¤vÓ.Ð.r)   c                ó,   € V P                  \        4      # )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   ra   s   &r&   Útest_noBufferSpaceFromAcceptÚ/SelectReactorTests.test_noBufferSpaceFromAcceptØ   s   € ð ×&Ñ&¤wÓ/Ð/r)   c                ó,   € V P                  \        4      # )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   ra   s   &r&   Ú test_connectionAbortedFromAcceptÚ3SelectReactorTests.test_connectionAbortedFromAcceptâ   s   € ð ×&Ñ&¤|Ó4Ð4r)   r8   z(Windows accept(2) cannot generate ENFILEc                ó,   € V P                  \        4      # )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   ra   s   &r&   Útest_noFilesFromAcceptÚ)SelectReactorTests.test_noFilesFromAcceptì   r‹   r)   z(Windows accept(2) cannot generate ENOMEMc                ó,   € V P                  \        4      # )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   ra   s   &r&   Útest_noMemoryFromAcceptÚ*SelectReactorTests.test_noMemoryFromAccept÷   s   € ð ×&Ñ&¤vÓ.Ð.r)   ÚINFRASTRUCTUREÚAZUREPIPELINESz(Hangs on Azure Pipelines due to firewallc                ó>  aa€ \        4       p\        Vn        V P                  ^ VRR7      oV P	                  SP
                  4       . oV3R lpV P	                  V4       V3R lpSP                  V! 4       4       ^Sn        SP                  4        V P                  SP                  ^4       SP                  V! 4       4       SP                  4        V P                  SP                  ^4       SP                  4        V P                  SP                  ^4       R# )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:   ri   c                  ó:   <€ S F  p V P                  4        K  	  R # r+   )r-   )rK   Úclientss    €r&   ÚcloseAllÚ7SelectReactorTests.test_acceptScaling.<locals>.closeAll  s   ø€ Û!�Ø—‘–ó "r)   c                  óÄ   <€ \         P                   ! \         P                  \         P                  4      p V P                  R SP	                  4       P
                  34       V # )r:   )r4   ÚAF_INETÚSOCK_STREAMÚconnectÚgetHostrI   )rK   rI   s    €r&   r¢   Ú6SelectReactorTests.test_acceptScaling.<locals>.connect  s?   ø€ Ü—]’]¤6§>¡>´6×3EÑ3EÓFˆFØ�N‰N˜K¨¯©«×)<Ñ)<Ð=Ô>ØˆMr)   N)r   r   ÚprotocolrI   Ú
addCleanupre   r5   ÚnumberAcceptsr}   r�   ÚassertEqual)r$   rm   r�   r¢   rœ   rI   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                óä  a aa€ ^{o^ .o ! VVV 3R lR4      p\        S4       F2  pS P                  \        P                  V! 4       P                  4       K4  	  S P                  S P
                  V! 4       P                  4       ^ .o\        4       pS P                  ^ VRR7      p^{Vn        S P                  VRV! 4       4       VP                  4        S P                  VP                  ^4       R# )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.
c                   ó6   <a € ] tR tRt o RtVVV3R ltRtV tR# )Ú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                ó¼   <€ S^ ;;,          ^,          uu&   S^ ,          S8”  d   SP                  R4       \        \        \        P                  ! \        4      4      h)r;   z(Maximum number of accept calls exceeded.)rC   rA   r   rs   rt   )ÚoselfÚacceptCallsÚmaximumNumberOfAcceptsr$   s   &€€€r&   rH   ÚSSelectReactorTests.test_permissionFailure.<locals>.FakeSocketWithAcceptLimit.acceptC  sA   ø€ Ø˜A— !Õ#“Ø˜q•>Ð$:Ô:Ø—I‘IÐHÔIÜœe¤R§[¢[´Ó%7Ó8Ð8r)   rw   Nrx   )rZ   r±   r²   r$   s   @€€€r&   ÚFakeSocketWithAcceptLimitr­   <  s   ù‡ € ñ÷9õ 9r)   r´   r:   ri   r4   N)r@   rF   r4   rG   rH   ÚfailureExceptionr   rI   r§   r|   r}   ÚassertEquals)r$   r´   Ú_rm   rI   r±   r²   s   f    @@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                ó  a€ \        \        4      pVP                  \        \        \
        .4       \        R V 4       4      ^,           o ! V3R lR4      p\        4       pV P                  ^ VRR7      pV P                  VRV! 4       4       VP                  4        V P                  \        P                  4      pV P                  ^\        V4      4       V P                  V^ ,          P                   P"                  ^ ,          S4       R# )ze
A C{socket.error} raised by C{accept(2)} whose C{errno} is
unknown to the recovery logic is logged.
c              3   óV   "  € T F  p\        V\        4      '       g   K  Vx € K!  	  R # 5ir+   )Ú
isinstanceÚint)Ú.0rG   s   & r&   Ú	<genexpr>ÚBSelectReactorTests.test_unknownSocketErrorRaise.<locals>.<genexpr>g  s   é € ÐI¡;˜%´*¸UÄC×2H—’£;ùs   ‚)Ÿ
)c                   ó2   <a € ] tR tRt o RtV3R ltRtV tR# )ÚYSelectReactorTests.test_unknownSocketErrorRaise.<locals>.FakeSocketWithUnknownAcceptErrorij  r®   c                ó   <€ \        SR 4      h)zunknown socket error message)rA   )r°   ÚunknownAcceptErrors   &€r&   rH   Ú`SelectReactorTests.test_unknownSocketErrorRaise.<locals>.FakeSocketWithUnknownAcceptError.acceptq  s   ø€ ÜÐ0Ð2PÓQÐQr)   rw   Nrx   )rZ   rÄ   s   @€r&   Ú FakeSocketWithUnknownAcceptErrorrÂ   j  s   ù‡ € ñ÷Ró Rr)   rÆ   r:   ri   r4   N)Úlistr	   Úextendr
   r   r   Úmaxr   rI   r|   r}   ÚflushLoggedErrorsr4   rG   r¨   r   ÚvaluerB   )r$   ÚknownErrorsrÆ   rm   rI   Ú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)   )r_   r^   N)rQ   rR   rS   rT   rU   r'   r1   rI   r†   r‰   r�   r�   r   r   rV   r“   r–   rs   Úenvironr€   r©   r¸   rÎ   rW   rX   rY   s   @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ð Hr)   r\   )'rU   r~   rs   r4   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\   rw   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