ó
    Ö›‘hÑ¦ ã                   ó¾  • S r SSK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
JrJrJrJrJr  SSKJr  SSKJrJr  SSKJrJr  SSKrSSKJrJr  SS	KJrJrJrJ r 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/  SSK0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;  SSK<J=r=J>r>J?r?  SSK@JArAJBrBJCrCJDrDJErEJFrFJGrG  SSKHJIrIJJrJJKrKJLrLJMrMJNrNJOrOJPrPJQrQ  SSKRJSrSJTrTJUrU  SSKVJWrWJXrX  SSKYJZrZ  SSK[J\r\  SSK]J^r^  SSK_J`r`  SSKaJbrbJcrcJdrdJere  SSKfJgrgJhrhJiri   SSKjJkrk  SSKlJmrm  SrnSrp \R
                  " \Râ                  \Rä                  5      rp\pRç                  S5        SrtSru\pb  \pRñ                  5         \`Rò                  " 5       (       a  SSKzJ{r{  \{Rø                  r}Sr~O SS KzJr  \GR                   r}Sr~S" r�S# r‚ " S$ S%5      rƒ " S& S'\i5      r„ " S( S)\>5      r…\" \65       " S* S+5      5       r†\" \6\†5         " S, S-\i5      r‡ " S. S/\i5      rˆ " S0 S1\L5      r‰ " S2 S3\‰5      rŠ\" \:5       " S4 S55      5       r‹ " S6 S7\S\K\O5      rŒ " S8 S9\Œ5      r�\" \t\u5       " S: S;\Œ5      5       rŽ " S< S=\S5      r� " S> S?\�5      r�\" \t\u5       " S@ SA\�5      5       r‘SB r’ " SC SD\5      r“\" \“5      \Rà                  " SSE9 " SF SG5      5       5       r”\" \~SH5       " SI SJ\h5      5       r•SK r–\" \~SH5       " SL SM\h5      5       r— " SN SO\M5      r˜ " SP SQ5      r™ " SR SS\™5      rš " ST SU\™5      r› " SV SW5      rœ " SX SY\S\š\œ\˜5      r� " SZ S[\S\›\œ\˜5      rž " S\ S]\>5      rŸS^ r S_ r¡S` r¢ " Sa Sb\S5      r£ " Sc Sd5      r¤ " Se Sf5      r¥ " Sg Sh\¥\¤\S5      r¦ " Si Sj\¥\¤\S5      r§\¨" 5       GRS                  \�GRU                  5       5        \¨" 5       GRS                  \ŽGRU                  5       5        \¨" 5       GRS                  \�GRU                  5       5        \¨" 5       GRS                  \žGRU                  5       5        \¨" 5       GRS                  \£GRU                  5       5        \¨" 5       GRS                  \�GRU                  5       5        \¨" 5       GRS                  \‘GRU                  5       5        \¨" 5       GRS                  \¦GRU                  5       5        \¨" 5       GRS                  \§GRU                  5       5         " Sk Sl\J5      r« " Sm Sn\J5      r¬ " So Sp\J5      r­ " Sq Sr\­5      r® " Ss St\J5      r¯ " Su Sv\J5      r° " Sw Sx\J5      r± " Sy Sz\±5      r² " S{ S|\±5      r³ " S} S~\³5      r´ " S S€\³5      rµ " S� S‚\J5      r¶ " Sƒ S„\J5      r· " S… S†\·5      r¸ " S‡ Sˆ\¶5      r¹ " S‰ SŠ\³5      rº " S‹ SŒ\¶5      r» " S� SŽ5      r¼ " S� S�\S\¼5      r½\¨" 5       GRS                  \½GRU                  5       5        \" \t\u5       " S‘ S’\i5      5       r¾ " S“ S”\h5      r¿\" \~SH5       " S• S–\h5      5       rÀ " S— S˜\h5      rÁg! \o a    Srn GNf = f! \v a  rwSrtS\w 3ru SrwCwGNîSrwCwff = f! \o a    S! r} GN°f = f)™zU
Tests for implementations of L{IReactorTCP} and the TCP parts of
L{IReactorSocket}.
é    N©Úwraps)ÚCallableÚClassVarÚListÚMappingÚOptionalÚSequenceÚType)ÚskipIf)Ú	InterfaceÚimplementer)ÚverifyClassÚverifyObject)ÚIPv4AddressÚIPv6Address)ÚDeferredÚDeferredListÚfailÚgatherResultsÚmaybeDeferredÚsucceed)ÚTCP4ClientEndpointÚTCP4ServerEndpoint)	ÚConnectBindErrorÚConnectionAbortedÚConnectionClosedÚConnectionDoneÚConnectionLostÚConnectionRefusedErrorÚDNSLookupErrorÚ
NoProtocolÚ	UserError)Ú
IConnectorÚIHalfCloseableProtocolÚILoggingContextÚIPullProducerÚIPushProducerÚIReactorFDSetÚIReactorSocketÚIReactorTCPÚIReactorTimeÚIResolverSimpleÚITLSTransport)ÚClientFactoryÚProtocolÚServerFactory)Ú
ConnectionÚServerÚ_BuffersLogsÚ_FileDescriptorReservationÚ_IFileDescriptorReservationÚ_NullFileDescriptorReservationÚ_resolveIPv6)	ÚBrokenContextFactoryÚConnectableProtocolÚConnectionTestsMixinÚEndpointCreatorÚLogObserverMixinÚStopÚStreamClientTestsMixinÚfindFreePortÚrunProtocolsWithReactor)ÚReactorBuilderÚneedsRunningReactorÚstopOnError)ÚMemoryReactorÚStringTransport)ÚLogger)Úlog)ÚFailure)Úplatform)ÚClientStartStopFactoryÚClosingFactoryÚMyClientFactoryÚMyServerFactory)ÚSkipTestÚSynchronousTestCaseÚTestCase)ÚSSL)ÚClientContextFactoryTF)ú::1r   Ú zIPv6 not available. )Ú_win32ifaces)Ú_posixifacesc                  ó   • / $ ©N© rZ   ó    ÚbC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/internet/test/test_tcp.pyÚ<lambda>r]   ‚   s   € ©Br[   c                  óD   • [        5       n U (       a  U S   $ [        S5      e)aP  
Find and return a configured link local IPv6 address including a scope
identifier using the % separation syntax.  If the system has no link local
IPv6 addresses, raise L{SkipTest} instead.

@raise SkipTest: if no link local address can be found or if the
    C{netifaces} module is not available.

@return: a C{str} giving the address
r   z#Link local IPv6 address unavailable)ÚgetLinkLocalIPv6AddressesrO   )Ú	addressess    r\   ÚgetLinkLocalIPv6Addressra   ‰   s%   € ô *Ó+€IÞØ˜‰|ÐÜ
Ð8Ó
9Ð9r[   c                 ó†   • Uu  p#SU;   d  SU;   a  [         R                  " X#5      S   S   nOX#4nU R                  U5        g)a  
Connect a socket to the given destination.

@param client: A C{socket.socket}.

@param destination: A tuple of (host, port). The host is a C{str}, the
    port a C{int}. If the C{host} is an IPv6 IP, the address is resolved
    using C{getaddrinfo} and the first version found is used.
Ú%Ú:r   é   N)ÚsocketÚgetaddrinfoÚconnect)ÚclientÚdestinationÚhostÚportÚaddresss        r\   rh   rh   š   sE   € ð �L€TØ
ˆdƒ{�c˜T“kÜ×$Ò$ TÓ0°Ñ3°AÑ6‰à�,ˆØ
‡N�N�7Õr[   c                   óH   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSrg)Ú
FakeSocketé¬   zÊ
A fake for L{socket.socket} objects.

@ivar data: A C{str} giving the data which will be returned from
    L{FakeSocket.recv}.

@ivar sendBuffer: A C{list} of the objects passed to L{FakeSocket.send}.
c                 ó   • Xl         / U l        g rY   )ÚdataÚ
sendBuffer©Úselfrr   s     r\   Ú__init__ÚFakeSocket.__init__¶   s   € ØŒ	Øˆ�r[   c                 ó   • Xl         g rY   )Úblocking)ru   ry   s     r\   ÚsetblockingÚFakeSocket.setblockingº   s   € Ø �r[   c                 ó   • U R                   $ rY   ©rr   )ru   Úsizes     r\   ÚrecvÚFakeSocket.recv½   s   € Ø�y‰yÐr[   c                 óN   • U R                   R                  U5        [        U5      $ )z–
I{Send} all of C{bytes} by accumulating it into C{self.sendBuffer}.

@return: The length of C{bytes}, indicating all the data has been
    accepted.
)rs   ÚappendÚlen©ru   Úbytess     r\   ÚsendÚFakeSocket.sendÀ   s    € ð 	�‰×Ñ˜uÔ%Ü�5‹zÐr[   c                 ó   • g)z¦
Shutdown is not implemented.  The method is provided since real sockets
have it and some code expects it.  No behavior of L{FakeSocket} is
affected by a call to it.
NrZ   )ru   Úhows     r\   ÚshutdownÚFakeSocket.shutdownÊ   ó   � r[   c                 ó   • g)z£
Close is not implemented.  The method is provided since real sockets
have it and some code expects it.  No behavior of L{FakeSocket} is
affected by a call to it.
NrZ   ©ru   s    r\   ÚcloseÚFakeSocket.closeÑ   rŒ   r[   c                 ó   • g)z¨
Setsockopt is not implemented.  The method is provided since
real sockets have it and some code expects it.  No behavior of
L{FakeSocket} is affected by a call to it.
NrZ   )ru   Úargss     r\   Ú
setsockoptÚFakeSocket.setsockoptØ   rŒ   r[   c                 ó   • g)z’
Return a fake file descriptor.  If actually used, this will have no
connection to this L{FakeSocket} and will probably cause surprising
results.
é   rZ   rŽ   s    r\   ÚfilenoÚFakeSocket.filenoß   s   € ð r[   )ry   rr   rs   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rv   rz   r   r†   rŠ   r�   r“   r—   Ú__static_attributes__rZ   r[   r\   ro   ro   ¬   s/   † ñòò!òòòòòõr[   ro   c                   ó*   • \ rS rSrSrS rS rS rSrg)ÚFakeSocketTestséè   zL
Test that the FakeSocket can be used by the doRead method of L{Connection}
c                 ót   • [        S5      nUR                  S5        U R                  UR                  S5        g )Nó   someDatar   )ro   rz   ÚassertEqualry   ©ru   Úskts     r\   Útest_blockingÚFakeSocketTests.test_blockingí   s,   € Ü˜Ó%ˆØ�‰˜ÔØ×Ñ˜Ÿ™ qÕ)r[   c                 ó\   • [        S5      nU R                  UR                  S5      S5        g )Nr£   é
   )ro   r¤   r   r¥   s     r\   Ú	test_recvÚFakeSocketTests.test_recvò   s$   € Ü˜Ó%ˆØ×Ñ˜Ÿ™ "› {Õ3r[   c                 óš   • [        S5      nUR                  S5      nU R                  US5        U R                  UR                  S/5        g)zp
L{FakeSocket.send} accepts the entire string passed to it, adds it to
its send buffer, and returns its length.
r[   s   fooé   N)ro   r†   r¤   rs   )ru   r¦   Úcounts      r\   Ú	test_sendÚFakeSocketTests.test_sendö   sA   € ô
 ˜‹oˆØ—‘˜Ó ˆØ×Ñ˜ Ô"Ø×Ñ˜Ÿ™¨&¨Õ2r[   rZ   N)	r™   rš   r›   rœ   r�   r§   r«   r°   rž   rZ   r[   r\   r    r    è   s   † ñò*ò
4õ3r[   r    c                   ó   • \ rS rSrSrS rSrg)ÚFakeProtocoli  zD
An L{IProtocol} that returns a value from its dataReceived method.
c                 ó   • g)zY
Return something other than L{None} to trigger a deprecation warning for
that behavior.
rZ   rZ   rt   s     r\   ÚdataReceivedÚFakeProtocol.dataReceived  s   € ð
 r[   rZ   N©r™   rš   r›   rœ   r�   rµ   rž   rZ   r[   r\   r³   r³     s   † ñõr[   r³   c                   óH   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSrg)Ú_FakeFDSetReactori  ag  
An in-memory implementation of L{IReactorFDSet}, which records the current
sets of active L{IReadDescriptor} and L{IWriteDescriptor}s.

@ivar _readers: The set of L{IReadDescriptor}s active on this
    L{_FakeFDSetReactor}
@type _readers: L{set}

@ivar _writers: The set of L{IWriteDescriptor}s active on this
    L{_FakeFDSetReactor}
@ivar _writers: L{set}
c                 ó@   • [        5       U l        [        5       U l        g rY   )ÚsetÚ_readersÚ_writersrŽ   s    r\   rv   Ú_FakeFDSetReactor.__init__  s   € Ü›ˆŒÜ›ˆ�r[   c                 ó:   • U R                   R                  U5        g rY   )r¼   Úadd©ru   Úreaders     r\   Ú	addReaderÚ_FakeFDSetReactor.addReader!  ó   € Ø�‰×Ñ˜&Õ!r[   c                 óZ   • XR                   ;   a  U R                   R                  U5        g g rY   )r¼   ÚremoverÁ   s     r\   ÚremoveReaderÚ_FakeFDSetReactor.removeReader$  ó#   € Ø—]‘]Ó"Ø�M‰M× Ñ  Õ(ð #r[   c                 ó:   • U R                   R                  U5        g rY   )r½   rÀ   ©ru   Úwriters     r\   Ú	addWriterÚ_FakeFDSetReactor.addWriter(  rÅ   r[   c                 óZ   • XR                   ;   a  U R                   R                  U5        g g rY   )r½   rÇ   rÌ   s     r\   ÚremoveWriterÚ_FakeFDSetReactor.removeWriter+  rÊ   r[   c                 óh   • U R                  5       U R                  5       -   nU R                  5         U$ rY   )Ú
getReadersÚ
getWritersrv   ©ru   Úresults     r\   Ú	removeAllÚ_FakeFDSetReactor.removeAll/  s(   € Ø—‘Ó" T§_¡_Ó%6Ñ6ˆØ�‰ŒØˆr[   c                 ó,   • [        U R                  5      $ rY   )Úlistr¼   rŽ   s    r\   rÔ   Ú_FakeFDSetReactor.getReaders4  ó   € Ü�D—M‘MÓ"Ð"r[   c                 ó,   • [        U R                  5      $ rY   )rÛ   r½   rŽ   s    r\   rÕ   Ú_FakeFDSetReactor.getWriters7  rÝ   r[   )r¼   r½   N)r™   rš   r›   rœ   r�   rv   rÃ   rÈ   rÎ   rÑ   rØ   rÔ   rÕ   rž   rZ   r[   r\   r¹   r¹     s/   † ñòò"ò)ò"ò)òò
#õ#r[   r¹   c                   ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
ÚTCPServerTestsi>  z4
Whitebox tests for L{twisted.internet.tcp.Server}.
c                 óä   • [        5       U l         " S S5      n[        S5      U l        [	        5       U l        [        U R                  U R
                  SU" 5       S U R                  5      U l        g )Nc                   ó   • \ rS rSrSrSrg)Ú&TCPServerTests.setUp.<locals>.FakePortiF  r®   rZ   N)r™   rš   r›   rœ   Ú_realPortNumberrž   rZ   r[   r\   ÚFakePorträ   F  s   † Ø‹Or[   ræ   r[   )rU   r   )r¹   Úreactorro   r¦   r0   Úprotocolr3   Úserver)ru   ræ   s     r\   ÚsetUpÚTCPServerTests.setUpC  sS   € Ü(Ó*ˆŒ÷	 ñ 	 ô ˜c“?ˆŒÜ ›
ˆŒÜØ�H‰H�d—m‘m W©h«j¸$ÀÇÁó
ˆ�r[   c                 óà   • U R                   R                  [        [        S5      5      5        U R                   R	                  S5        U R                  U R                  R                  / 5        g)zY
L{Server.write} discards bytes passed to it if called after it has lost
its connection.
úSimulated lost connectionó   hello worldN)ré   ÚconnectionLostrI   Ú	ExceptionÚwriter¤   r¦   rs   rŽ   s    r\   Útest_writeAfterDisconnectÚ(TCPServerTests.test_writeAfterDisconnectO  sM   € ð
 	�‰×"Ñ"¤7¬9Ð5PÓ+QÓ#RÔSØ�‰×Ñ˜.Ô)Ø×Ñ˜Ÿ™×,Ñ,¨bÕ1r[   c                 óF   • SU R                   l        U R                  5         g)z}
L{Server.write} discards bytes passed to it if called after it has lost
its connection when the connection had started TLS.
TN)ré   ÚTLSrò   rŽ   s    r\   Ú!test_writeAfterDisconnectAfterTLSÚ0TCPServerTests.test_writeAfterDisconnectAfterTLSX  s   € ð
 ˆ�‰ŒØ×&Ñ&Õ(r[   c                 óâ   • U R                   R                  [        [        S5      5      5        U R                   R	                  S/5        U R                  U R                  R                  / 5        g)za
L{Server.writeSequence} discards bytes passed to it if called after it
has lost its connection.
rí   rî   N)ré   rï   rI   rð   ÚwriteSequencer¤   r¦   rs   rŽ   s    r\   Ú!test_writeSequenceAfterDisconnectÚ0TCPServerTests.test_writeSequenceAfterDisconnect`  sP   € ð
 	�‰×"Ñ"¤7¬9Ð5PÓ+QÓ#RÔSØ�‰×!Ñ! >Ð"2Ô3Ø×Ñ˜Ÿ™×,Ñ,¨bÕ1r[   c                 óF   • SU R                   l        U R                  5         g)z…
L{Server.writeSequence} discards bytes passed to it if called after it
has lost its connection when the connection had started TLS.
TN)ré   rõ   rú   rŽ   s    r\   Ú)test_writeSequenceAfterDisconnectAfterTLSÚ8TCPServerTests.test_writeSequenceAfterDisconnectAfterTLSi  s   € ð
 ˆ�‰ŒØ×.Ñ.Õ0r[   )rè   rç   ré   r¦   N)r™   rš   r›   rœ   r�   rê   rò   rö   rú   rý   rž   rZ   r[   r\   rá   rá   >  s    † ñò

ò2ò)ò2õ1r[   rá   c                   óL   • \ rS rSrSrS rS r\" \(       + S5      S 5       r	Sr
g)	ÚTCPConnectionTestsir  z8
Whitebox tests for L{twisted.internet.tcp.Connection}.
c                 óB  • [        S5      n[        5       n[        X5      nUR                  5         U R	                  [        R
                  /5      nU R                  US   S   [        5        U R                  US   S   S5        U R                  [        U5      S5        g)z|
When an L{IProtocol} implementation that returns a value from its
C{dataReceived} method, a deprecated warning is emitted.
r£   r   ÚcategoryÚmessagezƒReturning a value other than None from twisted.internet.test.test_tcp.FakeProtocol.dataReceived is deprecated since Twisted 11.0.0.r–   N)	ro   r³   r2   ÚdoReadÚflushWarningsrµ   r¤   ÚDeprecationWarningrƒ   )ru   r¦   rè   ÚconnÚwarningss        r\   Útest_doReadWarningIsRaisedÚ-TCPConnectionTests.test_doReadWarningIsRaisedw  s�   € ô
 ˜Ó%ˆÜ“>ˆÜ˜#Ó(ˆØ�‰ŒØ×%Ñ%¤|×'@Ñ'@Ð&AÓBˆØ×Ñ˜ !™ ZÑ0Ô2DÔEØ×ÑØ�Q‰K˜	Ñ"ð2ô	
ð 	×Ñœ˜X›¨Õ*r[   c                 óz   • [        S5      n[        5       n[        X5      nU R                  UR                  5        g)zg
The C{TLS} attribute of a L{Connection} instance is C{False} before
L{Connection.startTLS} is called.
r[   N)ro   r³   r2   ÚassertFalserõ   ©ru   r¦   rè   r  s       r\   Útest_noTLSBeforeStartTLSÚ+TCPConnectionTests.test_noTLSBeforeStartTLSŠ  s0   € ô
 ˜‹oˆÜ“>ˆÜ˜#Ó(ˆØ×Ñ˜Ÿ™Õ"r[   zNo SSL support availablec                 óÊ   • [        S5      n[        5       n[        X[        5       S9nSUl        UR                  [        5       S5        U R                  UR                  5        g)ze
The C{TLS} attribute of a L{Connection} instance is C{True} after
L{Connection.startTLS} is called.
r[   ©rç   TN)	ro   r³   r2   r¹   Ú_tlsClientDefaultÚstartTLSrS   Ú
assertTruerõ   r  s       r\   Útest_tlsAfterStartTLSÚ(TCPConnectionTests.test_tlsAfterStartTLS”  sN   € ô ˜‹oˆÜ“>ˆÜ˜#Ô1BÓ1DÑEˆØ!%ˆÔØ�‰Ô*Ó,¨dÔ3Ø�‰˜Ÿ™Õ!r[   rZ   N)r™   rš   r›   rœ   r�   r	  r  r   ÚuseSSLr  rž   rZ   r[   r\   r   r   r  s/   † ñò+ò&#ñ �ŒJÐ2Ó3ñ
"ó 4ó
"r[   r   c                   ó(   • \ rS rSrSrSrS rS rSrg)Ú
TCPCreatori¢  zG
Create IPv4 TCP endpoints for L{runProtocolsWithReactor}-based tests.
ú	127.0.0.1c                 ó,   • [        USU R                  S9$ )z$
Create a server-side TCP endpoint.
r   ©Ú	interface)r   r  )ru   rç   s     r\   ré   ÚTCPCreator.server©  s   € ô " '¨1¸¿¹ÑGÐGr[   c                 óB   • [        XR                  UR                  5      $ )zh
Create a client end point that will connect to the given address.

@type serverAddress: L{IPv4Address}
)r   r  rl   )ru   rç   ÚserverAddresss      r\   ri   ÚTCPCreator.client¯  s   € ô " '¯>©>¸=×;MÑ;MÓNÐNr[   rZ   N)	r™   rš   r›   rœ   r�   r  ré   ri   rž   rZ   r[   r\   r  r  ¢  s   † ñð €IòHõOr[   r  c                   ó   • \ rS rSrSrS rSrg)ÚTCP6Creatori¸  a.  
Create IPv6 TCP endpoints for
C{ReactorBuilder.runProtocolsWithReactor}-based tests.

The endpoint types in question here are still the TCP4 variety, since
these simply pass through IPv6 address literals to the reactor, and we are
only testing address literals, not name resolution (as name resolution has
not yet been implemented).  See http://twistedmatrix.com/trac/ticket/4470
for more specific information about new endpoint classes.  The naming is
slightly misleading, but presumably if you're passing an IPv6 literal, you
know what you're asking for.
c                 ó"   • [        5       U l        g rY   ©ra   r  rŽ   s    r\   rv   ÚTCP6Creator.__init__Æ  ó   € Ü0Ó2ˆ�r[   r  N)r™   rš   r›   rœ   r�   rv   rž   rZ   r[   r\   r#  r#  ¸  s   † ñõ3r[   r#  c                   óP   • \ rS rSrSrS\\\4   4S jrSS\S\\	   SS4S	 jjr
S
rg)ÚFakeResolveriÊ  zJ
A resolver implementation based on a C{dict} mapping names to addresses.
Únamesc                 ó   • Xl         g rY   ©r*  )ru   r*  s     r\   rv   ÚFakeResolver.__init__Ð  s   € Ø�
r[   ÚnameÚtimeoutÚreturnzDeferred[str]c                 ó‚   •  [        U R                  U   5      $ ! [         a    [        [	        SU-   5      5      s $ f = f)z§
Return the address mapped to C{name} if it exists, or raise a
C{DNSLookupError}.

@param name: The name to resolve.

@param timeout: The lookup timeout, ignore here.
zFakeResolver couldn't find )r   r*  ÚKeyErrorr   r!   )ru   r.  r/  s      r\   ÚgetHostByNameÚFakeResolver.getHostByNameÓ  sC   € ð	NÜ˜4Ÿ:™: dÑ+Ó,Ð,øÜó 	NÜœÐ'DÀtÑ'KÓLÓMÒMð	Nús   ‚ š!>½>r,  N)rZ   )r™   rš   r›   rœ   r�   r   Ústrrv   r
   Úintr3  rž   rZ   r[   r\   r)  r)  Ê  sD   † ñð˜g c¨3 hÑ/ô ñN #ð N°¸±ð NÀ÷ Nð Nr[   r)  c                   ó`   • \ rS rSrSr\4rSr\S 5       r	\S 5       r
S rS rS rS	 rS
 rSrg)ÚTCPClientTestsBaseiâ  aU  
Base class for builders defining tests related to
L{IReactorTCP.connectTCP}.  Classes which uses this in must provide all of
the documented instance variables in order to specify how the test works.
These are documented as instance variables rather than declared as methods
due to some peculiar inheritance ordering concerns, but they are
effectively abstract methods.

@ivar endpoints: A client/server endpoint creator appropriate to the
    address family being tested.
@type endpoints: L{twisted.internet.test.connectionmixins.EndpointCreator}

@ivar interface: An IP address literal to locally bind a socket to as well
    as to connect to.  This can be any valid interface for the local host.
@type interface: C{str}

@ivar port: An unused local listening port to listen on and connect to.
    This will be used in conjunction with the C{interface}.  (Depending on
    what they're testing, some tests will locate their own port with
    L{findFreePort} instead.)
@type port: C{int}

@ivar family: an address family constant, such as L{socket.AF_INET},
    L{socket.AF_INET6}, or L{socket.AF_UNIX}, which indicates the address
    family of the transport type under test.
@type family: C{int}

@ivar addressClass: the L{twisted.internet.interfaces.IAddress} implementor
    associated with the transport type under test.  Must also be a
    3-argument callable which produces an instance of same.
@type addressClass: C{type}

@ivar fakeDomainName: A fake domain name to use, to simulate hostname
    resolution and to distinguish between hostnames and IP addresses where
    necessary.
@type fakeDomainName: C{str}
Nc                 óª   • U R                   b$  U R                   R                  5       R                  $ [        U R                  U R
                  5      S   $ )z•
Return the port number to connect to, using C{self._port} set up by
C{listen} if available.

@return: The port number to connect to.
@rtype: C{int}
r–   )Ú_portÚgetHostrl   r@   r  ÚfamilyrŽ   s    r\   rl   ÚTCPClientTestsBase.port  sA   € ð �:‰:Ñ!Ø—:‘:×%Ñ%Ó'×,Ñ,Ð,Ü˜DŸN™N¨D¯K©KÓ8¸Ñ;Ð;r[   c                 ó.   • U R                   R                  $ )z;
Return the interface attribute from the endpoints object.
)Ú	endpointsr  rŽ   s    r\   r  ÚTCPClientTestsBase.interface  s   € ð
 �~‰~×'Ñ'Ð'r[   c                 óX   • UR                  SX R                  S9U l        U R                  $ )z«
Start a TCP server with the given C{factory}.

@param reactor: The reactor to create the TCP port in.

@param factory: The server factory.

@return: A TCP port instance.
r   r  )Ú	listenTCPr  r:  ©ru   rç   Úfactorys      r\   ÚlistenÚTCPClientTestsBase.listen!  s)   € ð ×&Ñ& q¨'¿^¹^Ð&ÐLˆŒ
Ø�z‰zÐr[   c                 óP   • UR                  U R                  U R                  U5      $ )z²
Start a TCP client with the given C{factory}.

@param reactor: The reactor to create the connection in.

@param factory: The client factory.

@return: A TCP connector instance.
)Ú
connectTCPr  rl   rC  s      r\   rh   ÚTCPClientTestsBase.connect.  s!   € ð ×!Ñ! $§.¡.°$·)±)¸WÓEÐEr[   c                 ó  ^ ^
^^• [        5       mT R                  5       m[        5       nTUl        [	        T T5         " S S[
        5      m
T R                  R                  T5      R                  U5      nU
UU 4S jnUR                  U5      nU 4S jnS nUR                  XV5        U4S jnUR                  U5      nUR                  [        R                  5        U4S jn	UR                  U	5        T R                  T5        g)	zZ
When the factory's C{buildProtocol} returns L{None} the connection is
gracefully closed.
c                   ó   • \ rS rSrS rSrg)ÚETCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.NoneFactoryiG  c                 ó   • g rY   rZ   )ru   rm   s     r\   ÚbuildProtocolÚSTCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.NoneFactory.buildProtocolH  s   € Ør[   rZ   N©r™   rš   r›   rœ   rN  rž   rZ   r[   r\   ÚNoneFactoryrL  G  s   † õr[   rQ  c                 óˆ   >• T" 5       nTR                   R                  TU R                  5       5      nUR                  U5      $ rY   )r?  ri   r;  rh   )rl   ÚclientFactoryÚendpointrQ  rç   ru   s      €€€r\   ÚlistenedÚBTCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.listenedM  s7   ø€ Ù'›MˆMØ—~‘~×,Ñ,¨W°d·l±l³nÓEˆHØ×#Ñ# MÓ2Ð2r[   c                 ó2   >• TR                  SU < S35        g )Nz.Stream client endpoint connect succeeded with z%, should have failed with NoProtocol.)r   )rè   ru   s    €r\   ÚconnectSucceededÚJTCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.connectSucceededT  s   ø€ Ø�IŠIã9AðDõr[   c                 ó.   • U R                  [        5        g rY   )Útrapr"   )Úreasons    r\   ÚconnectFailedÚGTCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.connectFailedZ  s   € Ø�K‰Kœ
Õ#r[   c                 ó   >• T$ rY   rZ   )Úignoredrï   s    €r\   Ú	connectedÚCTCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.connected_  s   ø€ ð "Ð!r[   c                 ó&   >• TR                  5         g rY   ©Ústop)r`  rç   s    €r\   ÚdisconnectedÚFTCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.disconnectedj  s   ø€ ð
 �L‰L�Nr[   N)r   ÚbuildReactorrN   ÚprotocolConnectionLostrD   r1   r?  ré   rE  ÚaddCallbackÚaddCallbacksÚ
addErrbackrH   ÚerrÚ
runReactor)ru   ÚserverFactoryÚ	listeningrU  Ú
connectingrX  r]  ra  Údisconnectingrf  rQ  rï   rç   s   `         @@@r\   Útest_buildProtocolReturnsNoneÚ0TCPClientTestsBase.test_buildProtocolReturnsNone:  sá   û€ ô
 "›ˆØ×#Ñ#Ó%ˆÜ'Ó)ˆØ/=ˆÔ,ô 	�D˜'Ô"ô	œ-ô 	ð —N‘N×)Ñ)¨'Ó2×9Ñ9¸-ÓHˆ	÷	3ð
 ×*Ñ*¨8Ó4ˆ
õ	ò	$ð 	×ÑÐ 0Ô@õ	"ð #×.Ñ.¨yÓ9ˆð 	× Ñ ¤§¡Ô)õ	ð 	×!Ñ! ,Ô/à�‰˜Õ r[   c                 ó²  ^ ^	^
^^^• [        T R                  T R                  5      SS u  pT R                  5       mT R                  m
TR                  [        T
T R                  05      5        TR                  S[        R                  " [        5      US9mTR                  5       nSSSS.m " UU4S jS[        5      n[        T5      m	UT	l        U	U
UU U4S jn[        TU5        T R                  T5        T	R                   (       a)  T R#                  T	R                   R%                  5       5        S	R'                  TS
   R(                  TS
   R*                  [-        TS
   5      5      nU/[/        [0        R2                  " T R                  T	R4                  5      S   S   SS 5      -   nU/[/        [0        R2                  " T R                  UR6                  5      S   S   SS 5      -   nT R9                  TS   T R:                  " S/UQ76 5        T R9                  TS   T R:                  " S/UQ76 5        T R9                  [=        TS
   5      U5        g)ar  
A client's transport's C{getHost} and C{getPeer} return L{IPv4Address}
instances which have the dotted-quad string form of the resolved
address of the local and remote endpoints of the connection
respectively as their C{host} attribute, not the hostname originally
passed in to
L{connectTCP<twisted.internet.interfaces.IReactorTCP.connectTCP>}, if a
hostname was used.
Né   r   r  )rk   ÚpeerÚinstancec                   ó$   >• \ rS rSrU U4S jrSrg)Ú7TCPClientTestsBase.test_addresses.<locals>.CheckAddressi‹  c                 ó|   >• UR                  5       TS'   UR                  5       TS'   UTS'   TR                  5         g )Nrk   rw  rx  )r;  ÚgetPeerre  )ru   Ú	transportrç   ÚtransportDatas     €€r\   ÚmakeConnectionÚFTCPClientTestsBase.test_addresses.<locals>.CheckAddress.makeConnectionŒ  s<   ø€ Ø(1×(9Ñ(9Ó(;�˜fÑ%Ø(1×(9Ñ(9Ó(;�˜fÑ%Ø,5�˜jÑ)Ø—‘•r[   rZ   N©r™   rš   r›   rœ   r  rž   )rç   r~  s   €€r\   ÚCheckAddressrz  ‹  s   ø† ÷ñ r[   r‚  c                  ó(  >•  [        TR                  TR                  5      n TR                  U S   4n[        R                  " SU 35         TR                  TTR                  5       R                  TUS9  U S   Tl        g ! [         a     MŽ  f = f)Nr–   z!Connect attempt with bindAddress )ÚbindAddress)
r@   r  r<  rH   ÚmsgrH  r;  rl   Ú	boundPortr   )rl   r„  rS  Ú
fakeDomainrç   ru   ré   s     €€€€€r\   Ú	connectMeÚ4TCPClientTestsBase.test_addresses.<locals>.connectMe•  s–   ø€ ØÜ# D§N¡N°D·K±KÓ@�Ø#Ÿ~™~¨t°A©wÐ7�Ü—’Ð;¸K¸=ÐIÔJðØ×&Ñ&Ø"ØŸ™Ó(×-Ñ-Ø%Ø$/ð	 'ñ ð /3°1©g�MÔ+Øøô	 (ó Úðús   Á*B Â
BÂBz<{} to {} at {:x}>rx  éÿÿÿÿr–   rk   ÚTCPrw  )r@   r  r<  rh  ÚfakeDomainNameÚinstallResolverr)  rB  r1   ÚforProtocolr0   r;  r>   rè   rC   rn  Ú
failReasonr   ÚgetTracebackÚformatÚ	__class__ÚaddrÚidrÛ   rf   rg   r†  rl   r¤   ÚaddressClassÚrepr)ru   rk   r`  r   r‚  rˆ  ÚtransportReprr†  Ú
serverPortrS  r‡  rç   ré   r~  s   `        @@@@@r\   Útest_addressesÚ!TCPClientTestsBase.test_addressesu  s!  ý€ ô % T§^¡^°T·[±[ÓAÀ"À1ÐE‰ˆØ×#Ñ#Ó%ˆØ×(Ñ(ˆ
Ø×Ñ¤¨j¸$¿.¹.Ð-IÓ JÔKà×"Ñ"ØŒ}×(Ò(¬Ó2¸dð #ð 
ˆð Ÿ™Ó(ˆà!%¨tÀÑFˆ÷	ð 	œ8ô 	ô ˜W›ˆØ!-ˆÔ÷	ñ 	ô$ 	˜G YÔ/à�‰˜Ô à×#×#Ø�I‰I�m×.Ñ.×;Ñ;Ó=Ô>à,×3Ñ3Ø˜*Ñ%×/Ñ/Ø˜*Ñ%×*Ñ*Üˆ}˜ZÑ(Ó)ó
ˆð �FœTÜ×Ò˜tŸ~™~¨}×/FÑ/FÓGÈÑJÈ2ÑNÈqÈrÐRó
ñ 
ˆ	ð �VœdÜ×Ò˜tŸ~™~¨}×/AÑ/AÓBÀ1ÑEÀbÑIÈ!È"ÐMó
ñ 
ˆ
ð 	×Ñ˜ vÑ.°×0AÒ0AÀ%Ð0TÈ)Ò0TÔUØ×Ñ˜ vÑ.°×0AÒ0AÀ%Ð0UÈ*Ò0UÔVØ×Ñœ˜m¨JÑ7Ó8¸-ÕHr[   c                 óÐ  ^ ^^^^	^
^• T R                  5       m
[        5       m/ m[        R                  " [        5      nT
R                  SUT R                  S9nT R                  R                  T
UR                  5       5      n[        5       n[        Ul        UR                  U5      mUUU 4S jm	U4S jmUUU	U
4S jn[        T
U5        T R                  T
5        T R                  [!        T5      SST 35        [#        TS   [$        5      (       a  TS   R'                  5         TS   S:X  a  [)        S	5      eT R                  [        R*                  [-        TS   5      5        g
)z¦
If the context factory passed to L{ITCPTransport.startTLS} raises an
exception from its C{getContext} method, that exception is raised by
L{ITCPTransport.startTLS}.
r   r  c                 óè   >• [         R                  " U R                  5      (       d  TR                  S5        g TR                  TR	                  [
        U R                  R                  T5      5        g )NÚskip)r.   Ú
providedByr}  r‚   ÚassertRaisesÚ
ValueErrorr  )rè   ÚbrokenFactoryÚresultsru   s    €€€r\   ra  Ú5TCPClientTestsBase.test_badContext.<locals>.connectedÒ  sS   ø€ Ü ×+Ò+¨H×,>Ñ,>×?Ñ?Ø—‘˜vÕ&à—‘Ø×%Ñ%Ü" H×$6Ñ$6×$?Ñ$?Àóõr[   c                 ó(   >• TR                  U 5        g rY   ©r‚   )Úfailurer¢  s    €r\   r]  Ú9TCPClientTestsBase.test_badContext.<locals>.connectFailedÜ  s   ø€ Ø�N‰N˜7Õ#r[   c                  ót   >• T R                  T5        T R                  T5        T R                  U4S j5        g )Nc                 ó$   >• TR                  5       $ rY   rd  ©Úignrç   s    €r\   r]   ÚETCPClientTestsBase.test_badContext.<locals>.whenRun.<locals>.<lambda>â  s   ø€ °·±´r[   )rj  rl  ÚaddBoth)ÚconnectDeferredr]  ra  rç   s   €€€€r\   ÚwhenRunÚ3TCPClientTestsBase.test_badContext.<locals>.whenRunß  s.   ø€ Ø×'Ñ'¨	Ô2Ø×&Ñ& }Ô5Ø×#Ñ#Ô$>Õ?r[   r–   zmore than one callback result: r�  z&Reactor does not support ITLSTransportN)rh  r9   r1   rŽ  r0   rB  r  r?  ri   r;  r/   rè   rh   rC   rn  r¤   rƒ   Ú
isinstancerI   ÚraiseExceptionrO   r  r5  )ru   ro  rl   rT  rS  r¯  r¡  r®  r]  ra  rç   r¢  s   `     @@@@@@r\   Útest_badContextÚ"TCPClientTestsBase.test_badContext¿  s*  þ€ ð ×#Ñ#Ó%ˆä,Ó.ˆØˆä%×1Ò1´(Ó;ˆØ× Ñ   M¸T¿^¹^Ð ÐLˆØ—>‘>×(Ñ(¨°$·,±,³.ÓAˆä%›ˆÜ!)ˆÔØ"×*Ñ*¨=Ó9ˆ÷	õ	$÷	@ð 	@ô
 	˜G WÔ-à�‰˜Ô à×Ñœ˜W› qÐ,KÈGÈ9Ð*UÔVä�g˜a‘j¤'×*Ñ*à�A‰J×%Ñ%Ô'Ø�1‰:˜ÓÜÐCÓDÐDØ×ÑÔ-×5Ñ5´s¸7À1¹:³ÕGr[   )r:  )r™   rš   r›   rœ   r�   r+   ÚrequiredInterfacesr:  Úpropertyrl   r  rE  rh   rs  r™  r³  rž   rZ   r[   r\   r8  r8  â  s\   † ñ$ðL &˜Ðà€Eàñ
<ó ð
<ð ñ(ó ð(òò
Fò9!òvHIõT0Hr[   r8  c                   óF   • \ rS rSrSrSr\R                  r\	r
\" 5       rSrg)ÚTCP4ClientTestsBuilderiò  zY
Builder configured with IPv4 parameters for tests related to
L{IReactorTCP.connectTCP}.
zsome-fake.domain.example.comrZ   N)r™   rš   r›   rœ   r�   rŒ  rf   ÚAF_INETr<  r   r•  r  r?  rž   rZ   r[   r\   r¸  r¸  ò  s#   † ñð
 4€NØ�^‰^€FØ€Lá“ƒIr[   r¸  c                   ó:   • \ rS rSrSr\R                  r\r	S r
Srg)ÚTCP6ClientTestsBuilderiÿ  zY
Builder configured with IPv6 parameters for tests related to
L{IReactorTCP.connectTCP}.
c                 óX   • [        5       U l        U R                  R                  U l        g rY   )r#  r?  r  rŒ  rŽ   s    r\   rê   ÚTCP6ClientTestsBuilder.setUp	  s!   € ô %›ˆŒð #Ÿn™n×6Ñ6ˆÕr[   )r?  rŒ  N)r™   rš   r›   rœ   r�   rf   ÚAF_INET6r<  r   r•  rê   rž   rZ   r[   r\   r»  r»  ÿ  s   † ñð
 �_‰_€FØ€Lõ
7r[   r»  c                   ó0   • \ rS rSrSr\4rS rS rS r	Sr
g)ÚTCPConnectorTestsBuilderi  zM
Tests for the L{IConnector} provider returned by L{IReactorTCP.connectTCP}.
c                 ó  ^^^	• [        5       nU R                  5       mTR                  SXR                  S9nX!l        UR                  5       R                  n/ m/ m	[        5       nUU	4S jUl        TR                  Ul	        TR                  U R                  X45      nU R                  [        R                  " U5      5        UR                  5       nU R                  UR                   S5        U R                  UR"                  U R                  5        U R                  UR                  U5        UR$                  R'                  U4S j5        U R)                  T5        T	S   R+                  [,        5        U R                  TXU/5        g)a%  
L{IReactorTCP.connectTCP} returns an object which provides
L{IConnector}.  The destination of the connector is the address which
was passed to C{connectTCP}.  The same connector object is passed to
the factory's C{startedConnecting} method as to the factory's
C{clientConnectionLost} method.
r   r  c                 óH   >• TR                  U 5      TR                  U5      4$ rY   r¥  )Ú	connectorr\  ÚseenConnectorsÚseenFailuress     €€r\   r]   ÚATCPConnectorTestsBuilder.test_connectorIdentity.<locals>.<lambda>/  s%   ø€ Ø×!Ñ! )Ó,Ø×Ñ Ó'ñH
r[   r‹  c                 ó$   >• TR                  5       $ rY   rd  ©Ú_rç   s    €r\   r]   rÆ  <  ó   ø€ °G·L±L´Nr[   N)rL   rh  rB  r  rl   r;  rK   ÚclientConnectionLostr‚   ÚstartedConnectingrH  r  r$   rž  ÚgetDestinationr¤   Útyperk   ÚwhenStoppedr­  rn  r[  r   )
ru   ro  ÚtcpPortÚ
portNumberrS  rÃ  Údestrç   rÄ  rÅ  s
          @@@r\   Útest_connectorIdentityÚ/TCPConnectorTestsBuilder.test_connectorIdentity  s9  ú€ ô 'Ó(ˆØ×#Ñ#Ó%ˆØ×#Ñ# A }ÇÁÐ#ÐOˆØ$ÔØ—_‘_Ó&×+Ñ+ˆ
àˆØˆä.Ó0ˆõ.
ˆÔ*ð +9×*?Ñ*?ˆÔ'à×&Ñ& t§~¡~°zÓQˆ	Ø�‰œ
×-Ò-¨iÓ8Ô9Ø×'Ñ'Ó)ˆØ×Ñ˜Ÿ™ EÔ*Ø×Ñ˜Ÿ™ D§N¡NÔ3Ø×Ñ˜Ÿ™ JÔ/à×!Ñ!×)Ñ)Ô*BÔCà�‰˜Ô à�Q‰×Ñœ^Ô,Ø×Ñ˜¨)Ð)?Õ@r[   c                 ó8  ^ ^^^^• [        5       nT R                  5       mTR                  SUT R                  S9nUR	                  5       R
                  m/ mUU4S jn[        5       mUTl        TR                  R                  U4S j5        TR                  UUUU 4S j5        T R                  T5        T(       a"  T R                  TS   R                  5       5        TR                  R                  [         5        T R#                  TR$                  S5        g)z§
Calling L{IConnector.stopConnecting} in C{Factory.startedConnecting}
results in C{Factory.clientConnectionFailed} being called with
L{error.UserError} as the reason.
r   r  c                 óš   >•  U R                  5         g ! [         a,    TR                  [        5       5        TR	                  5          g f = frY   )ÚstopConnectingrð   r‚   rI   re  )rÃ  ÚfatalErrorsrç   s    €€r\   rÌ  ÚATCPConnectorTestsBuilder.test_userFail.<locals>.startedConnectingP  s<   ø€ ðØ×(Ñ(Õ*øÜó Ø×"Ñ"¤7£9Ô-Ø—‘–ðús   ƒ ”3A
Á	A
c                 ó$   >• TR                  5       $ rY   rd  rÈ  s    €r\   r]   Ú8TCPConnectorTestsBuilder.test_userFail.<locals>.<lambda>Z  rÊ  r[   c                  ó>   >• TR                  TR                  TT 5      $ rY   )rH  r  )rS  rÑ  rç   ru   s   €€€€r\   r]   rÛ  ]  s   ø€ �G×&Ñ& t§~¡~°zÀ=ÔQr[   r–   N)rN   rh  rB  r  r;  rl   rK   rÌ  rÏ  r­  ÚcallWhenRunningrn  r   r�  r\  r[  r#   r¤   Úfailed)ru   ro  rÐ  rÌ  rS  rØ  rÑ  rç   s   `   @@@@r\   Útest_userFailÚ&TCPConnectorTestsBuilder.test_userFailC  sÞ   ü€ ô (Ó)ˆØ×#Ñ#Ó%ˆØ×#Ñ# A }ÀÇÁÐ#ÐOˆØ—_‘_Ó&×+Ñ+ˆ
àˆö	ô /Ó0ˆØ*;ˆÔ'à×!Ñ!×)Ñ)Ô*BÔCà×ÑßQô	
ð 	�‰˜Ô æØ�I‰I�k !‘n×1Ñ1Ó3Ô4Ø×Ñ×!Ñ!¤)Ô,Ø×Ñ˜×-Ñ-¨qÕ1r[   c                 óä  ^^^• [        5       nU R                  5       mTR                  SXR                  S9nX!l        UR                  5       R                  n[        5       mS nUTl        TR                  U R                  UT5        / mUUU4S jnTR                  R                  U5        U R                  T5        TR                  R                  [        5        U R                  TS/5        g)zn
Calling L{IConnector.connect} in C{Factory.clientConnectionLost} causes
a new connection attempt to be made.
r   r  c                 ó$   • U R                  5         g rY   )rh   )rÃ  r\  s     r\   rË  ÚETCPConnectorTestsBuilder.test_reconnect.<locals>.clientConnectionLostt  s   € Ø×ÑÕr[   c                 óŒ   >• TR                   nTR                  UR                  UR                  45        TR	                  5         g rY   )ÚlastProtocolr‚   ÚmadeÚclosedre  )r`  ÚprS  ÚprotocolMadeAndClosedrç   s     €€€r\   ÚreconnectFailedÚ@TCPConnectorTestsBuilder.test_reconnect.<locals>.reconnectFailed|  s2   ø€ Ø×*Ñ*ˆAØ!×(Ñ(¨!¯&©&°!·(±(Ð);Ô<Ø�L‰L�Nr[   )r–   r–   N)rL   rh  rB  r  rl   r;  rM   rË  rH  ÚfailDeferredrj  rn  r\  r[  r    r¤   )	ru   ro  rÐ  rÑ  rË  rê  rS  ré  rç   s	         @@@r\   Útest_reconnectÚ'TCPConnectorTestsBuilder.test_reconnectg  sÏ   ú€ ô
 'Ó(ˆØ×#Ñ#Ó%ˆØ×#Ñ# A }ÇÁÐ#ÐOˆØ$ÔØ—_‘_Ó&×+Ñ+ˆ
ä'Ó)ˆò	 ð .BˆÔ*Ø×Ñ˜4Ÿ>™>¨:°}ÔEà "Ð÷	ð
 	×"Ñ"×.Ñ.¨Ô?à�‰˜Ô à×Ñ×!Ñ!Ô"8Ô9Ø×ÑÐ.°°Õ9r[   rZ   N)r™   rš   r›   rœ   r�   r+   rµ  rÓ  rß  rí  rž   rZ   r[   r\   rÀ  rÀ    s#   † ñð &˜Ðò$AòL"2õH:r[   rÀ  c                   ó4   • \ rS rSrSr\R                  r\r	Sr
g)ÚTCP4ConnectorTestsBuilderi‰  r  rZ   N)r™   rš   r›   rœ   r  rf   r¹  r<  r   r•  rž   rZ   r[   r\   rð  rð  ‰  s   † Ø€IØ�^‰^€FØƒLr[   rð  c                   ó6   • \ rS rSr\R
                  r\rS r	Sr
g)ÚTCP6ConnectorTestsBuilderi�  c                 ó"   • [        5       U l        g rY   r%  rŽ   s    r\   rê   ÚTCP6ConnectorTestsBuilder.setUp”  r'  r[   r  N)r™   rš   r›   rœ   rf   r¾  r<  r   r•  rê   rž   rZ   r[   r\   rò  rò  �  s   † à�_‰_€FØ€Lõ3r[   rò  c                 óh   • [         R                   " X5      nU R                  UR                  5        U$ )zÏ
Create a socket for the duration of the given test.

@param test: the test to add cleanup to.

@param addressFamily: an C{AF_*} constant

@param socketType: a C{SOCK_*} constant.

@return: a socket object.
)rf   Ú
addCleanupr�   )ÚtestÚaddressFamilyÚ
socketTyper¦   s       r\   ÚcreateTestSocketrú  ˜  s'   € ô �-Š-˜Ó
2€CØ‡O�O�C—I‘IÔØ€Jr[   c                   ó*   • \ rS rSrSrS rS rS rSrg)Ú_IExhaustsFileDescriptorsi©  z
A way to trigger C{EMFILE}.
c                  ó   • g)z»
Open file descriptors until C{EMFILE} is reached.

This can raise any exception except an L{OSError} whose
C{errno} is C{EMFILE}.  Any exception raised to the caller
implies L{release}.
NrZ   rZ   r[   r\   ÚexhaustÚ!_IExhaustsFileDescriptors.exhaust®  rŒ   r[   c                  ó   • g©z4
Release all file descriptors opened by L{exhaust}.
NrZ   rZ   r[   r\   ÚreleaseÚ!_IExhaustsFileDescriptors.release·  rŒ   r[   c                  ó   • g)úª
Return the number of opened file descriptors.

@return: The number of opened file descriptors; this will be
    zero if this instance has not opened any.
@rtype: L{int}
NrZ   rZ   r[   r\   r¯   Ú_IExhaustsFileDescriptors.count¼  rŒ   r[   rZ   N©	r™   rš   r›   rœ   r�   rþ  r  r¯   rž   rZ   r[   r\   rü  rü  ©  s   † ñòòõ
r[   rü  )Úauto_attribsc                   ó"  • \ rS rSr% Sr\" 5       r\\   \S'   \	R                  " S SS9r\/ \4   \S'   \	R                  " \R                  SS9r\\/S4   \S	'   \	R                  " \	R"                  " \5      SSS
9r\\   \S'   S rS rS rSrg)Ú_ExhaustsFileDescriptorsiÆ  a?  
A class that triggers C{EMFILE} by creating as many file
descriptors as necessary.

@ivar fileDescriptorFactory: A factory that creates a new file
    descriptor.
@type fileDescriptorFactory: A L{callable} that accepts no
    arguments and returns an integral file descriptor, suitable
    for passing to L{os.close}.
Ú_logc                  ó.   • [         R                  " S5      $ ©Nr   )ÚosÚduprZ   r[   r\   r]   Ú!_ExhaustsFileDescriptors.<lambda>Ö  s   € œŸš˜qœ	r[   F)Údefaultr–  Ú_fileDescriptorFactoryNÚ_close)r  Úinitr–  Ú_fileDescriptorsc                 óˆ  • [         R                  " 5            U R                  5       nU R                  R	                  U5        M.  ! [
         a)  nUR                  [        R                  :X  a   SnAO	e SnAff = fU R                  R                  SU R                  5       S9  g! [         a    U R                  5         e f = f)z3
Open file descriptors until C{EMFILE} is reached.
NzCEMFILE reached by opening {openedFileDescriptors} file descriptors.)ÚopenedFileDescriptors)ÚgcÚcollectr  r  r‚   ÚOSErrorÚerrnoÚEMFILEr  Úinfor¯   rð   r  ©ru   ÚfdÚes      r\   rþ  Ú _ExhaustsFileDescriptors.exhaustÝ  s­   € ô
 	�
Š
Œð	Øð5Ø×4Ñ4Ó6�Bð ×)Ñ)×0Ñ0°Ô4ñ øô ó Ø—w‘w¤%§,¡,Ó.ÜØûðúð �I‰I�N‰Nð=à&*§j¡j£lð ò øô	 ó 	Ø�L‰LŒNØð	ús9   —B% ™A ©B% Á
A9ÁA4Á.B% Á3A4Á4A9Á9B% Â%Cc                 ó  • U R                   (       a@  U R                   R                  5       n U R                  U5        U R                   (       a  M?  gg! [         a*  nUR                  [        R
                  :X  a   SnAM€  e SnAff = fr  )r  Úpopr  r  r  ÚEBADFr  s      r\   r  Ú _ExhaustsFileDescriptors.release÷  sg   € ð ×#×#Ø×&Ñ&×*Ñ*Ó,ˆBðØ—‘˜B”ð ×#×#Ó#øô ó Ø—7‘7œeŸk™kÓ)ÝØûðús   ­A Á
BÁBÂBÂBc                 ó,   • [        U R                  5      $ )r  )rƒ   r  rŽ   s    r\   r¯   Ú_ExhaustsFileDescriptors.count  s   € ô �4×(Ñ(Ó)Ð)r[   rZ   )r™   rš   r›   rœ   r�   rG   r  r   Ú__annotations__ÚattrÚibr  r   r6  r  r�   r  ÚFactoryrÛ   r  r   rþ  r  r¯   rž   rZ   r[   r\   r
  r
  Æ  s�   ‡ ñ	ñ $›X€Dˆ(�6Ñ
Ó%Ø04·²Ù!¨ñ1Ð˜H R¨ WÑ-ó ð %)§G¢G°B·H±HÀ5Ñ$I€FˆH�c�U˜D�[Ñ!ÓIØ"&§'¢'Ø—’˜TÓ"¨°Uñ#Ð�d˜3‘ió òò4õ*r[   r
  ú9Reserved EMFILE file descriptor not supported on Windows.c                   óT   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)ÚExhaustsFileDescriptorsTestsi  z(
Tests for L{_ExhaustsFileDescriptors}.
c                 ól   • [        5       U l        U R                  U R                  R                  5        g rY   )r
  Ú	exhausterrö  r  rŽ   s    r\   rê   Ú"ExhaustsFileDescriptorsTests.setUp  s$   € Ü1Ó3ˆŒð 	�‰˜Ÿ™×.Ñ.Õ/r[   c                 óR   • [        [        R                  5      R                  5         g)zH
Attempt to open a file; if successful, the file is immediately
closed.
N)Úopenr  Údevnullr�   rŽ   s    r\   Ú	openAFileÚ&ExhaustsFileDescriptorsTests.openAFile  s   € ô
 	ŒR�Z‰ZÓ×ÑÕ r[   c                 ó8   • [        [        U R                  5        g)zM
L{_ExhaustsFileDescriptors} instances provide
L{_IExhaustsFileDescriptors}.
N)r   rü  r0  rŽ   s    r\   Útest_providesInterfaceÚ3ExhaustsFileDescriptorsTests.test_providesInterface"  s   € ô
 	Ô.°·±Õ?r[   c                 óh  • U R                  U R                  R                  5       S5        U R                  R                  5         U R	                  U R                  R                  5       S5        U R                  R                  5         U R                  U R                  R                  5       S5        g)zP
L{_ExhaustsFileDescriptors.count} returns the number of open
file descriptors.
r   N)r¤   r0  r¯   rþ  ÚassertGreaterr  rŽ   s    r\   Ú
test_countÚ'ExhaustsFileDescriptorsTests.test_count)  s{   € ð
 	×Ñ˜Ÿ™×-Ñ-Ó/°Ô3Ø�‰×ÑÔ Ø×Ñ˜4Ÿ>™>×/Ñ/Ó1°1Ô5Ø�‰×ÑÔ Ø×Ñ˜Ÿ™×-Ñ-Ó/°Õ3r[   c                 ó  • U R                  U R                  R                  5        U R                  R                  5         U R	                  [
        U R                  5      nU R                  UR                  [        R                  5        g)zc
L{_ExhaustsFileDescriptors.exhaust} causes the process to
exhaust its available file descriptors.
N)
rö  r0  r  rþ  rŸ  ÚIOErrorr5  r¤   r  r  )ru   Ú	exceptions     r\   Útest_exhaustTriggersEMFILEÚ7ExhaustsFileDescriptorsTests.test_exhaustTriggersEMFILE4  sX   € ð
 	�‰˜Ÿ™×.Ñ.Ô/Ø�‰×ÑÔ Ø×%Ñ%¤g¨t¯~©~Ó>ˆ	Ø×Ñ˜Ÿ™¬%¯,©,Õ7r[   c                 ó`   • S n[        U5      nU R                  [        UR                  5        g)z‚
An L{OSError} raised within
L{_ExhaustsFileDescriptors.exhaust} with an C{errno} other
than C{EMFILE} is reraised to the caller.
c                  ó<   • [        [        R                  S-   S5      e)Nr–   z
Not EMFILE)r  r  r  rZ   r[   r\   ÚraiseOSErrorÚLExhaustsFileDescriptorsTests.test_exhaustRaisesOSError.<locals>.raiseOSErrorE  s   € Üœ%Ÿ,™,¨Ñ*¨LÓ9Ð9r[   N)r
  rŸ  r  rþ  )ru   rE  r0  s      r\   Útest_exhaustRaisesOSErrorÚ6ExhaustsFileDescriptorsTests.test_exhaustRaisesOSError>  s)   € ò	:ô -¨\Ó:ˆ	Ø×Ñœ' 9×#4Ñ#4Õ5r[   c                 óŒ   • U R                   R                  5         U R                   R                  5         U R                  5         g)zK
L{_ExhaustsFileDescriptors.release} releases all opened
file descriptors.
N)r0  rþ  r  r5  rŽ   s    r\   Útest_releaseÚ)ExhaustsFileDescriptorsTests.test_releaseK  s.   € ð
 	�‰×ÑÔ Ø�‰×ÑÔ à�‰Õr[   c                 óÈ  ^• / mU4S jn[        U5      nU R                  UR                  5        U R                  [        UR
                  5        U R                  [        T5      S5        U R                  UR                  5       S5        T HR  nU R                  [        [        R                  U5      nU R                  UR                  [        R                  5        MT     g)z{
L{_ExhaustsFileDescriptors.exhaust} closes any opened file
descriptors if an exception occurs during its exhaustion loop.
c                  óŠ   >• [        T5      S:X  a  [        S5      e[        R                  " S5      n TR	                  U 5        U $ )Nr®   z9test_fileDescriptorsReleasedOnFailure fake open exceptionr   )rƒ   r   r  r  r‚   ©r  ÚfileDescriptorss    €r\   ÚfailsAfterThreeÚ[ExhaustsFileDescriptorsTests.test_fileDescriptorsReleasedOnFailure.<locals>.failsAfterThree\  sB   ø€ Ü�?Ó# qÓ(Ü ØRóð ô —V’V˜A“Y�Ø×&Ñ& rÔ*Ø�	r[   r®   r   N)r
  rö  r  rŸ  r   rþ  r¤   rƒ   r¯   r  r  Úfstatr  r$  )ru   rP  r0  r  r@  rO  s        @r\   Ú%test_fileDescriptorsReleasedOnFailureÚBExhaustsFileDescriptorsTests.test_fileDescriptorsReleasedOnFailureU  s©   ø€ ð
 ˆõ	ô -¨_Ó=ˆ	Ø�‰˜	×)Ñ)Ô*à×Ñœ* i×&7Ñ&7Ô8Ø×Ñœ˜_Ó-¨qÔ1Ø×Ñ˜Ÿ™Ó*¨AÔ.ã!ˆBØ×)Ñ)¬'´2·8±8¸RÓ@ˆIØ×Ñ˜YŸ_™_¬e¯k©kÖ:ò "r[   c                 óT  ^• / mU4S jn[        U5      nU R                  UR                  5        UR                  5         U R	                  UR                  5       S5        [        R                  " TS   5        UR                  5         U R                  UR                  5       S5        g)z{
L{_ExhaustsFileDescriptors.release} continues to close opened
file descriptors even when closing one fails with C{EBADF}.
c                  óV   >• [         R                  " S5      n TR                  U 5        U $ r  )r  r  r‚   rN  s    €r\   ÚrecordFileDescriptorsÚTExhaustsFileDescriptorsTests.test_releaseIgnoresEBADF.<locals>.recordFileDescriptorsx  s#   ø€ Ü—’˜“ˆBØ×"Ñ" 2Ô&ØˆIr[   r   N)	r
  rö  r  rþ  r;  r¯   r  r�   r¤   )ru   rW  r0  rO  s      @r\   Útest_releaseIgnoresEBADFÚ5ExhaustsFileDescriptorsTests.test_releaseIgnoresEBADFq  s…   ø€ ð
 ˆõ	ô
 -Ð-BÓCˆ	Ø�‰˜	×)Ñ)Ô*à×ÑÔØ×Ñ˜9Ÿ?™?Ó,¨aÔ0ä
�Š� Ñ#Ô$à×ÑÔØ×Ñ˜Ÿ™Ó*¨AÕ.r[   c                 ó  ^• / mU4S jnS n[        XS9nU R                  UR                  5       S5        UR                  5         U R	                  UR                  5       S5        U R                  [        UR                  5        g)z�
An L{OSError} raised within
L{_ExhaustsFileDescriptors.release} with an C{errno} other than
C{EBADF} is reraised to the caller.
c                  ó‚   >• [        T 5      S:X  a  [        [        R                  S5      eT R	                  S5        T S   $ )Nr®   zToo many filesrŠ  )rƒ   r  r  r  r‚   )ÚfakeFileDescriptorss   €r\   Ú
opensThreeÚJExhaustsFileDescriptorsTests.test_releaseRaisesOSError.<locals>.opensThree�  s<   ø€ ÜÐ&Ó'¨1Ó,ÜœeŸl™lÐ,<Ó=Ð=Ø×&Ñ& rÔ*Ø& rÑ*Ð*r[   c                 ó   • [        SS5      e)Né   z&test_releaseRaisesOSError fake OSError)r  )r  s    r\   ÚfailingCloseÚLExhaustsFileDescriptorsTests.test_releaseRaisesOSError.<locals>.failingClose–  s   € Ü˜"ÐFÓGÐGr[   )r�   r   N)r
  r¤   r¯   rþ  r;  rŸ  r  r  )ru   r^  rb  r0  r]  s       @r\   Útest_releaseRaisesOSErrorÚ6ExhaustsFileDescriptorsTests.test_releaseRaisesOSErrorˆ  sr   ø€ ð !Ðõ	+ò	Hô -¨ZÑLˆ	à×Ñ˜Ÿ™Ó*¨AÔ.Ø×ÑÔØ×Ñ˜9Ÿ?™?Ó,¨aÔ0Ø×Ñœ' 9×#4Ñ#4Õ5r[   )r0  N)r™   rš   r›   rœ   r�   rê   r5  r8  r<  rA  rG  rJ  rS  rY  rd  rž   rZ   r[   r\   r.  r.    s:   † ñò0ò!ò@ò	4ò8ò6òò;ò8/õ.6r[   r.  c                 óv  ^^^^^^^• U R                  TR                  5        [        5       m[        5       nUTl        S/mUU4S jnUR                  U5        [        5       m[        R                  " T5      (       a*  UUUUUU4S jnTR                  STR                  SU5        O>T" TT5      n	U	R                  5       n
T" TU
T5        TR                  TR                  5        UU4S jnTR                  R                  U5        TR                  R                  U5        U" T5        / nUR                  UR                   5        U R#                  US5        U R%                  TR                  5        U R'                  TR                  5        U R)                  [*        TR,                  R.                  5        g)aÏ  
Assert that an L{IListeningPort} immediately closes an accepted
peer socket when the number of open file descriptors exceeds the
soft resource limit.

@param testCase: The test case under which to run this assertion.
@type testCase: L{trial.unittest.SynchronousTestCase}

@param exhauster: The file descriptor exhauster.
@type exhauster: L{_ExhaustsFileDescriptors}

@param reactor: The reactor under test.

@param runReactor: A callable that will synchronously run the
    provided reactor.

@param listen: A callback to bind to a port.
@type listen: A L{callable} that accepts two arguments: the
    provided C{reactor}; and a L{ServerFactory}.  It must return
    an L{IListeningPort} provider.

@param connect: A callback to connect a client to the listening
    port.
@type connect: A L{callable} that accepts three arguments: the
    provided C{reactor}; the address returned by
    L{IListeningPort.getHost}; and a L{ClientFactory}.  Its return
    value is ignored.
Fc                 ó0   >• TR                  5         STS'   g )NTr   rd  )rÉ  rç   ÚserverConnectionCompleteds    €€r\   ÚstopReactorIfServerAcceptedÚ=assertPeerClosedOnEMFILE.<locals>.stopReactorIfServerAcceptedÌ  s   ø€ Ø�‰ŒØ'+Ð! !Ò$r[   c                  ól   >• T" TT5      n U R                  5       nT" TUT5        TR                  5         g rY   )r;  rþ  )rl   ÚlisteningHostrS  rh   r0  rE  rç   ro  s     €€€€€€r\   ÚinnerÚ'assertPeerClosedOnEMFILE.<locals>.innerÚ  s2   ø€ Ù˜' =Ó1ˆDØ ŸL™L›NˆMÙ�G˜]¨MÔ:Ø×ÑÕr[   r   c                 óH   >• TR                  5         TR                  5         U $ rY   )r  re  )r×   r0  rç   s    €€r\   Ú"stopReactorAndCloseFileDescriptorsÚDassertPeerClosedOnEMFILE.<locals>.stopReactorAndCloseFileDescriptorsè  s   ø€ Ø×ÑÔØ�‰ŒØˆr[   z1Server accepted connection; EMFILE not triggered.N)rö  r  rN   r   ÚprotocolConnectionMaderj  rM   r,   rž  Ú	callLaterr;  rÝ  rþ  Údeferredr­  rì  r‚   r  ÚassertNoResultÚsuccessResultOfrŸ  r   Ú
lostReasonr²  )ÚtestCaser0  rç   rn  rE  rh   ÚserverConnectionMaderi  rm  rl   rl  rp  ÚnoResultrS  rh  ro  s    `` ``       @@@r\   ÚassertPeerClosedOnEMFILEr{  ¡  sq  þ€ ðH ×Ñ˜	×)Ñ)Ô*ä#Ó%€MÜ#›:ÐØ+?€MÔ(Ø!& Ðö,ð ×$Ñ$Ð%@ÔAä#Ó%€Mä×Ò˜w×'Ñ'÷	 ò 	 ð 	×Ñ˜!˜W×.Ñ.°°5Õ9ñ �g˜}Ó-ˆØŸ™›ˆÙ�˜¨Ô6Ø×Ñ 	× 1Ñ 1Ô2öð
 ×Ñ×"Ñ"Ð#EÔFØ×Ñ×&Ñ&Ð'IÔJáˆwÔà€HØ× Ñ  §¡Ô1Ø×Ñ˜Ð#VÔWØ×Ñ˜M×6Ñ6Ô7Ø×Ñ˜]×3Ñ3Ô4Ø×ÑÜØ× Ñ ×/Ñ/õr[   c                   óT   • \ rS rSrSr\" \5       " S S5      5       rS rS r	S r
Srg	)
ÚAssertPeerClosedOnEMFILETestsiý  z(
Tests for L{assertPeerClosedOnEMFILE}.
c                   ó*   • \ rS rSrSrS rS rS rSrg)Ú+AssertPeerClosedOnEMFILETests.NullExhausteri  z!
An exhauster that does nothing.
c                 ó   • g)z*
See L{_IExhaustsFileDescriptors.exhaust}
NrZ   rŽ   s    r\   rþ  Ú3AssertPeerClosedOnEMFILETests.NullExhauster.exhaust	  rŒ   r[   c                 ó   • g)z*
See L{_IExhaustsFileDescriptors.release}
NrZ   rŽ   s    r\   r  Ú3AssertPeerClosedOnEMFILETests.NullExhauster.release  rŒ   r[   c                 ó   • g)z(
See L{_IExhaustsFileDescriptors.count}
NrZ   rŽ   s    r\   r¯   Ú1AssertPeerClosedOnEMFILETests.NullExhauster.count  rŒ   r[   rZ   Nr  rZ   r[   r\   ÚNullExhausterr    s   † ñ	ò	ò
	õ
	r[   r†  c                 ó@   • [        5       U l        [        5       U l        g rY   )rE   rç   rP   rx  rŽ   s    r\   rê   Ú#AssertPeerClosedOnEMFILETests.setUp  s   € Ü$“ˆŒÜ+Ó-ˆ�r[   c                 ó@   • [        [        U R                  5       5        g)zB
L{NullExhauster} instances provide
L{_IExhaustsFileDescriptors}.
N)r   rü  r†  rŽ   s    r\   Ú#test_nullExhausterProvidesInterfaceÚAAssertPeerClosedOnEMFILETests.test_nullExhausterProvidesInterface  s   € ô
 	Ô.°×0BÑ0BÓ0DÕEr[   c                 óN  ^• U R                  5       nS/mU4S jnU4S jnS nU R                  U R                  R                  [        U R                  UU R
                  UUUS9nU R                  S[        U5      5        U R                  U R
                  R                  5        g)z}
If the exhauster fails to trigger C{EMFILE} and a connection
reaches the server, the reactor is stopped and the test fails.
Nc                 ó–   >• U R                  5         TS   R                  [        SSS5      5      nUR                  [	        5       5        g )Nr   r‹  r  iá  )ÚrunrN  r   r  rF   )rç   Úprotoro  s     €r\   rn  Ú[AssertPeerClosedOnEMFILETests.test_reactorStoppedOnSuccessfulConnection.<locals>.runReactor+  s@   ø€ Ø�K‰KŒMØ! !Ñ$×2Ñ2Ü˜E ;°Ó5óˆEð × Ñ ¤Ó!2Õ3r[   c                 óX   >• U R                  SSU5      nUR                  5         UTS'   U$ )Nr  iÒ  r   )rB  ÚdoStart)rç   rD  rl   ro  s      €r\   rE  ÚWAssertPeerClosedOnEMFILETests.test_reactorStoppedOnSuccessfulConnection.<locals>.listen2  s0   ø€ Ø×$Ñ$ [°$¸Ó@ˆDØ�O‰OÔØ&ˆM˜!ÑØˆKr[   c                 ó*   • U R                  SSU5        g )Nr  r   )rH  )rç   rm   rD  s      r\   rh   ÚXAssertPeerClosedOnEMFILETests.test_reactorStoppedOnSuccessfulConnection.<locals>.connect8  s   € Ø×Ñ˜{¨A¨wÕ7r[   ©rx  r0  rç   rn  rE  rh   r  )
r†  rŸ  rx  ÚfailureExceptionr{  rç   ÚassertInr5  r  Úrunning)ru   r0  rn  rE  rh   r@  ro  s         @r\   Ú)test_reactorStoppedOnSuccessfulConnectionÚGAssertPeerClosedOnEMFILETests.test_reactorStoppedOnSuccessfulConnection#  s–   ø€ ð
 ×&Ñ&Ó(ˆ	Ø˜ˆõ	4õ	ò	8ð ×%Ñ%Ø�M‰M×*Ñ*Ü$Ø—]‘]ØØ—L‘LØ!ØØð &ð 	
ˆ	ð 	�‰�h¤ I£Ô/Ø×Ñ˜Ÿ™×-Ñ-Õ.r[   )rç   rx  N)r™   rš   r›   rœ   r�   r   rü  r†  rê   rŠ  rš  rž   rZ   r[   r\   r}  r}  ý  s6   † ññ Ð*Ó+÷ð ó ,ðò(.òFõ$/r[   r}  c                   óB   • \ rS rSrSrS rS r\" \S5      S 5       r	Sr
g)	ÚStreamTransportTestsMixiniJ  zJ
Mixin defining tests which apply to any port/connection based transport.
c                 ó  • U R                  5       nU R                  5       n[        [        5       " S S[        5      5       nU" 5       nU R                  X$5      nU R                  US5      nU R                  U4US   S   5        g)z\
When a port starts, a message including a description of the associated
factory is logged.
c                   ó   • \ rS rSrS rSrg)ÚNStreamTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeFactoryiW  c                 ó   • g)NúCrazy FactoryrZ   rŽ   s    r\   Ú	logPrefixÚXStreamTransportTestsMixin.test_startedListeningLogMessage.<locals>.SomeFactory.logPrefixY  s   € Ø&r[   rZ   N)r™   rš   r›   rœ   r£  rž   rZ   r[   r\   ÚSomeFactoryr   W  s   † õ'r[   r¥  r¢  r   r  N)Úobserverh  r   r&   r1   ÚgetListeningPortÚ#getExpectedStartListeningLogMessager¤   )ru   ÚloggedMessagesrç   r¥  rD  rè  ÚexpectedMessages          r\   Útest_startedListeningLogMessageÚ9StreamTransportTestsMixin.test_startedListeningLogMessageO  sƒ   € ð
 Ÿ™›ˆØ×#Ñ#Ó%ˆä	”_Ó	%ô	'œ-ó 	'ó 
&ð	'ñ “-ˆØ×!Ñ! 'Ó3ˆØ×BÑBÀ1ÀoÓVˆØ×Ñ˜/Ð+¨^¸AÑ->¸yÑ-IÕJr[   c                 óD  ^^^^^• / mU4S jmU R                  5       mU R                  T[        5       5      mU R                  T5      n[        R
                  " T5        UU4S jmUUU4S jnTR                  U5        TR                  5         U R                  UT5        g)z¯
When a connection is lost, an informative message should be logged
(see L{getExpectedConnectionLostLogMsg}): an address identifying
the port and the fact that it was closed.
c                 óP   >• TR                  [        R                  " U 5      5        g rY   )r‚   rH   ÚtextFromEventDict)Ú	eventDictr©  s    €r\   ÚlogConnectionLostMsgÚQStreamTransportTestsMixin.test_connectionLostLogMsg.<locals>.logConnectionLostMsgj  s   ø€ Ø×!Ñ!¤#×"7Ò"7¸	Ó"BÕCr[   c                 óR   >• [         R                  " T5        TR                  5         g rY   )rH   ÚremoveObserverre  )r`  r±  rç   s    €€r\   ÚstopReactorÚHStreamTransportTestsMixin.test_connectionLostLogMsg.<locals>.stopReactorr  s   ø€ Ü×ÒÐ3Ô4Ø�L‰L�Nr[   c                  óz   >• [         R                  " T 5        [        TR                  5      R	                  T5        g rY   )rH   ÚaddObserverr   ÚstopListeningrj  )r±  rè  rµ  s   €€€r\   ÚdoStopListeningÚLStreamTransportTestsMixin.test_connectionLostLogMsg.<locals>.doStopListeningv  s'   ø€ Ü�OŠOÐ0Ô1Ü˜!Ÿ/™/Ó*×6Ñ6°{ÕCr[   N)	rh  r§  r1   ÚgetExpectedConnectionLostLogMsgrH   r¸  rÝ  rŽ  r˜  )ru   rª  rº  r±  r©  rè  rç   rµ  s      @@@@@r\   Útest_connectionLostLogMsgÚ3StreamTransportTestsMixin.test_connectionLostLogMsga  sƒ   ü€ ð ˆõ	Dð ×#Ñ#Ó%ˆØ×!Ñ! '¬=«?Ó;ˆØ×>Ñ>¸qÓAˆÜ�ŠÐ,Ô-ö	÷	Dð 	×Ñ Ô0Ø�‰Œà�‰�o ~Õ6r[   r,  c           	      óˆ   • [        U [        5       U R                  5       U R                  U R                  U R
                  S9  g)z"
See L{assertPeerClosedOnEMFILE}.
r–  N)r{  r
  rh  rn  r§  ÚconnectToListenerrŽ   s    r\   Útest_closePeerOnEMFILEÚ0StreamTransportTestsMixin.test_closePeerOnEMFILE  s:   € ô
 	!ØÜ.Ó0Ø×%Ñ%Ó'Ø—‘Ø×(Ñ(Ø×*Ñ*ó	
r[   rZ   N)r™   rš   r›   rœ   r�   r«  r½  r   ÚSKIP_EMFILErÁ  rž   rZ   r[   r\   r�  r�  J  s/   † ñòKò$7ñ< ˆKÐTÓUñ
ó Vó
r[   r�  c                   ó"   • \ rS rSrSrSrS rSrg)ÚConnectToTCPListenerMixiniŽ  aB  
Provides L{connectToListener} for TCP transports.

@ivar LISTENER_HOST: The host on which the port is expected to be
    listening.  This is specific to avoid compatibility issues
    with Windows, which cannot connect to the wildcard host.
@type LISTENER_HOST: L{str}

@see: U{http://twistedmatrix.com/trac/ticket/1472}
r  c                 óP   • UR                  U R                  UR                  U5      $ )al  
Connect to the given listening TCP port.

@param reactor: The reactor under test.
@type reactor: L{IReactorTCP}

@param address: The listening port's address.  Only the
    C{port} component is used; see L{LISTENER_HOST}.
@type address: L{IPv4Address} or L{IPv6Address}

@param factory: The client factory.
@type factory: L{ClientFactory}

@return: The connector
)rH  ÚLISTENER_HOSTrl   )ru   rç   rm   rD  s       r\   rÀ  Ú+ConnectToTCPListenerMixin.connectToListenerœ  s#   € ð  ×!Ñ! $×"4Ñ"4°g·l±lÀGÓLÐLr[   rZ   N)r™   rš   r›   rœ   r�   rÇ  rÀ  rž   rZ   r[   r\   rÅ  rÅ  Ž  s   † ñ	ð  €MõMr[   rÅ  c                   ó"   • \ rS rSrSrSS jrSrg)ÚListenTCPMixini¯  zL
Mixin which uses L{IReactorTCP.listenTCP} to hand out listening TCP ports.
c                 ó"   • UR                  X2US9$ )z 
Get a TCP port from a reactor.
r  )rB  )ru   rç   rD  rl   r  s        r\   r§  ÚListenTCPMixin.getListeningPort´  s   € ð × Ñ  ¸)Ð ÐDÐDr[   rZ   N©r   rU   ©r™   rš   r›   rœ   r�   r§  rž   rZ   r[   r\   rÊ  rÊ  ¯  s   † ñ÷Er[   rÊ  c                   ó"   • \ rS rSrSrSS jrSrg)ÚSocketTCPMixini»  zU
Mixin which uses L{IReactorSocket.adoptStreamPort} to hand out
listening TCP ports.
c                 óN  • [         R                  " U5      (       aÛ  SU;   a-  [        R                  n[        R                  " XC5      S   S   nO[        R
                  nXC4n[        R                  " U5      nUR                  U5        UR                  S5        UR                  S5         UR                  UR                  5       UR                  U5      UR                  5         UR                  5         $ [        S5      e! UR                  5         UR                  5         f = f)zQ
Get a TCP port from a reactor, wrapping an already-initialized file
descriptor.
rd   r   re   r®   Fz'Reactor does not provide IReactorSocket)r*   rž  rf   r¾  rg   r¹  ÚbindrE  rz   ÚadoptStreamPortr—   r<  r�   rO   )ru   rç   rD  rl   r  Údomainrm   ÚportSocks           r\   r§  ÚSocketTCPMixin.getListeningPortÁ  sè   € ô
 ×$Ò$ W×-Ñ-Ø�iÓÜŸ™�Ü ×,Ò,¨YÓ=¸aÑ@ÀÑC‘äŸ™�Ø$Ð+�Ü—}’} VÓ,ˆHØ�M‰M˜'Ô"Ø�O‰O˜AÔØ× Ñ  Ô'ð
!Ø×.Ñ.Ø—O‘OÓ% x§¡¸óð —‘Ô!ð —‘Õ äÐDÓEÐEøð —‘Ô!ð —‘Õ ús   Â,*D Ä"D$rZ   NrÍ  rÎ  rZ   r[   r\   rÐ  rÐ  »  s   † ñ÷
Fr[   rÐ  c                   ó\  • \ rS rSr% Sr\4r\\\	\
         \S'   S rS rS r\" \\5      S 5       r\" \\5      S 5       rS	 rS
 r\" \\5      S 5       r\" \\5      S 5       rS rS r\" \\5      S 5       r\" \\5      S 5       rS r\" \\5      S 5       r\" \\5      S 5       rSrg)ÚTCPPortTestsMixinià  z$
Tests for L{IReactorTCP.listenTCP}
rµ  c                 ó>   • SX!R                  5       R                  4-  $ )zI
Get the message expected to be logged when a TCP port starts listening.
z%s starting on %d©r;  rl   )ru   rl   rD  s      r\   r¨  Ú5TCPPortTestsMixin.getExpectedStartListeningLogMessageç  s   € ð # g¯|©|«~×/BÑ/BÐ%CÑCÐCr[   c                 ó>   • SUR                  5       R                   S3$ )z:
Get the expected connection lost message for a TCP port.
z
(TCP Port z Closed)rÚ  )ru   rl   s     r\   r¼  Ú1TCPPortTestsMixin.getExpectedConnectionLostLogMsgí  s    € ð ˜DŸL™L›N×/Ñ/Ð0°Ð9Ð9r[   c                 ó¤   • U R                  5       nU R                  U[        5       5      nUR                  5       nU R	                  U[
        5        g)zr
When no interface is passed to L{IReactorTCP.listenTCP}, the returned
listening port listens on an IPv4 address.
N)rh  r§  r1   r;  ÚassertIsInstancer   )ru   rç   rl   rm   s       r\   Útest_portGetHostOnIPv4Ú(TCPPortTestsMixin.test_portGetHostOnIPv4ó  sA   € ð
 ×#Ñ#Ó%ˆØ×$Ñ$ W¬m«oÓ>ˆØ—,‘,“.ˆØ×Ñ˜g¤{Õ3r[   c                 óN  • U R                  5       n[        [        R                  SS9SS u  p#U R	                  U[        5       X25      nUR                  5       nU R                  U[        5        U R                  SUR                  5        U R                  X5R                  5        g)z©
When listening on an IPv6 address, L{IListeningPort.getHost} returns
an L{IPv6Address} with C{host} and C{port} attributes reflecting the
address the port is bound to.
rT   )r<  r  Nrv  )rh  r@   rf   r¾  r§  r1   r;  rß  r   r¤   rk   rl   )ru   rç   rk   rÑ  rl   rm   s         r\   Útest_portGetHostOnIPv6Ú(TCPPortTestsMixin.test_portGetHostOnIPv6ý  s…   € ð ×#Ñ#Ó%ˆÜ'¬v¯©È%ÑPÐQSÐRSÐTÑˆØ×$Ñ$ W¬m«o¸zÓPˆØ—,‘,“.ˆØ×Ñ˜g¤{Ô3Ø×Ñ˜ §¡Ô-Ø×Ñ˜§\¡\Õ2r[   c                 óò   • [        5       nU R                  5       nU R                  U[        5       SU5      nUR	                  5       nU R                  U[        5        U R                  XR                  5        g)a   
When a link-local IPv6 address including a scope identifier is passed
as the C{interface} argument to L{IReactorTCP.listenTCP}, the resulting
L{IListeningPort} reports its address as an L{IPv6Address} with a host
value that includes the scope identifier.
r   N)	ra   rh  r§  r1   r;  rß  r   r¤   rk   )ru   Ú	linkLocalrç   rl   rm   s        r\   Útest_portGetHostOnIPv6ScopeIDÚ/TCPPortTestsMixin.test_portGetHostOnIPv6ScopeID  s_   € ô ,Ó-ˆ	Ø×#Ñ#Ó%ˆØ×$Ñ$ W¬m«o¸qÀ)ÓLˆØ—,‘,“.ˆØ×Ñ˜g¤{Ô3Ø×Ñ˜§L¡LÕ1r[   c                 óø  ^•  " U4S jS[         5      nU" 5       nU R                  5       mU R                  TUSU5      nUR                  S5         [	        XR                  5       R                  UR                  5       R                  45        U R                  T5        UR                  $ ! [         aD  nU R                  UR                  [        R                  [        R                  45         SnANfSnAff = f)a·  
Connect C{client} to a server listening on C{interface} started with
L{IReactorTCP.listenTCP} and return the address passed to the factory's
C{buildProtocol} method.

@param client: A C{SOCK_STREAM} L{socket.socket} created with an address
    family such that it will be able to connect to a server listening on
    C{interface}.

@param interface: A C{str} giving an address for a server to listen on.
    This should almost certainly be the loopback address for some
    address family supported by L{IReactorTCP.listenTCP}.

@return: Whatever object, probably an L{IAddress} provider, is passed to
    a server factory's C{buildProtocol} method when C{client}
    establishes a connection.
c                   ó"   >• \ rS rSrU 4S jrSrg)ÚCTCPPortTestsMixin._buildProtocolAddressTest.<locals>.ObserveAddressi.  c                 óD   >• TR                  5         Xl        [        5       $ rY   )re  ÚobservedAddressr0   )ru   rm   rç   s     €r\   rN  ÚQTCPPortTestsMixin._buildProtocolAddressTest.<locals>.ObserveAddress.buildProtocol/  s   ø€ Ø—‘”Ø'.Ô$Ü“zÐ!r[   )rí  NrP  r  s   €r\   ÚObserveAddressrë  .  s   ø† ÷"ð "r[   rï  r   FN)r1   rh  r§  rz   rh   r;  rk   rl   r  r˜  r  ÚEINPROGRESSÚEWOULDBLOCKrn  rí  )ru   ri   r  rï  rD  rl   r   rç   s          @r\   Ú_buildProtocolAddressTestÚ+TCPPortTestsMixin._buildProtocolAddressTest  sÊ   ø€ ÷&	"œ]ô 	"ñ !Ó"ˆØ×#Ñ#Ó%ˆØ×$Ñ$ W¨g°q¸)ÓDˆØ×Ñ˜5Ô!ð	KÜ�FŸ\™\›^×0Ñ0°$·,±,³.×2EÑ2EÐFÔGð 	�‰˜Ô à×&Ñ&Ð&øô ó 	KØ�M‰M˜!Ÿ'™'¤E×$5Ñ$5´u×7HÑ7HÐ#I×JÑJûð	Kús   Á=B+ Â+
C9Â5:C4Ã4C9c                 óÐ   • Sn[        U [        R                  [        R                  5      nU R	                  X!5      nU R                  [        S/UR                  5       Q76 U5        g)zŠ
When a connection is accepted over IPv4, an L{IPv4Address} is passed
to the factory's C{buildProtocol} method giving the peer's address.
r  r‹  N)rú  rf   r¹  ÚSOCK_STREAMrò  r¤   r   Úgetsockname)ru   r  ri   rí  s       r\   Útest_buildProtocolIPv4AddressÚ/TCPPortTestsMixin.test_buildProtocolIPv4AddressA  sT   € ð
  ˆ	Ü! $¬¯©¼×8JÑ8JÓKˆØ×8Ñ8¸ÓKˆØ×Ñœ UÐB¨V×-?Ñ-?Ó-AÒBÀOÕTr[   c                 ó*  • Sn[        U [        R                  [        R                  5      nU R	                  X!5      nUR                  5       n[        R                  " U[        R                  5      S   nU R                  [        SXTS   5      U5        g)z“
When a connection is accepted to an IPv6 address, an L{IPv6Address} is
passed to the factory's C{buildProtocol} method giving the peer's
address.
rT   r   r‹  r–   N)
rú  rf   r¾  rõ  rò  rö  ÚgetnameinfoÚNI_NUMERICHOSTr¤   r   ©ru   r  ri   rí  rw  Úhostnames         r\   Útest_buildProtocolIPv6AddressÚ/TCPPortTestsMixin.test_buildProtocolIPv6AddressK  sw   € ð ˆ	Ü! $¬¯©¼×9KÑ9KÓLˆØ×8Ñ8¸ÓKˆà×!Ñ!Ó#ˆÜ×%Ò% d¬F×,AÑ,AÓBÀ1ÑEˆà×Ñœ U¨H¸1±gÓ>ÀÕPr[   c                 ó<  • [        5       n[        U [        R                  [        R                  5      nU R                  X!5      nUR                  5       n[        R                  " U[        R                  5      S   nU R                  [        SU/USS Q76 U5        g)z»
When a connection is accepted to a link-local IPv6 address, an
L{IPv6Address} is passed to the factory's C{buildProtocol} method
giving the peer's address, including a scope identifier.
r   r‹  r–   N)ra   rú  rf   r¾  rõ  rò  rö  rú  rû  r¤   r   rü  s         r\   Ú$test_buildProtocolIPv6AddressScopeIDÚ6TCPPortTestsMixin.test_buildProtocolIPv6AddressScopeID[  s�   € ô ,Ó-ˆ	Ü! $¬¯©¼×9KÑ9KÓLˆØ×8Ñ8¸ÓKˆà×!Ñ!Ó#ˆÜ×%Ò% d¬F×,AÑ,AÓBÀ1ÑEˆà×Ñœ U¨HÐ@°t¸A¸B°xÒ@À/ÕRr[   c                 ó  ^^•  " UU4S jS[         5      nU R                  5       m[        5       nXEl        U R	                  TUSU5      nUR                  S5         [        XR                  5       R                  UR                  5       R                  45        U R                  T5        UR                   $ ! [         aD  nU R                  UR                  [        R                  [        R                  45         SnANfSnAff = f)a%  
Connect C{client} to a server listening on C{interface} started with
L{IReactorTCP.listenTCP} and return the address returned by one of the
server transport's address lookup methods, C{getHost} or C{getPeer}.

@param client: A C{SOCK_STREAM} L{socket.socket} created with an address
    family such that it will be able to connect to a server listening on
    C{interface}.

@param interface: A C{str} giving an address for a server to listen on.
    This should almost certainly be the loopback address for some
    address family supported by L{IReactorTCP.listenTCP}.

@param which: A C{str} equal to either C{"getHost"} or C{"getPeer"}
    determining which address will be returned.

@return: Whatever object, probably an L{IAddress} provider, is returned
    from the method indicated by C{which}.
c                   ó$   >• \ rS rSrU U4S jrSrg)ÚITCPPortTestsMixin._serverGetConnectionAddressTest.<locals>.ObserveAddressi€  c                 óf   >• TR                  5         [        UT5      " 5       U R                  l        g rY   )re  ÚgetattrrD  rm   )ru   r}  rç   Úwhichs     €€r\   r  ÚXTCPPortTestsMixin._serverGetConnectionAddressTest.<locals>.ObserveAddress.makeConnection�  s"   ø€ Ø—‘”Ü'.¨y¸%Ô'@Ó'B�—‘Õ$r[   rZ   Nr�  )rç   r  s   €€r\   rï  r  €  s   ø† ÷Cñ Cr[   rï  r   FN)r0   rh  r1   rè   r§  rz   rh   r;  rk   rl   r  r˜  r  rð  rñ  rn  rm   )	ru   ri   r  r  rï  rD  rl   r   rç   s	      `    @r\   Ú_serverGetConnectionAddressTestÚ1TCPPortTestsMixin._serverGetConnectionAddressTestk  sÕ   ù€ ÷*	Cð 	CœXô 	Cð
 ×#Ñ#Ó%ˆÜ“/ˆØ)ÔØ×$Ñ$ W¨g°q¸)ÓDˆØ×Ñ˜5Ô!ð	KÜ�FŸ\™\›^×0Ñ0°$·,±,³.×2EÑ2EÐFÔGð 	�‰˜Ô Ø�‰Ðøô ó 	KØ�M‰M˜!Ÿ'™'¤E×$5Ñ$5´u×7HÑ7HÐ#I×JÑJûð	Kús   Á=B6 Â6
DÃ :C?Ã?Dc                 óÒ   • Sn[        U [        R                  [        R                  5      nU R	                  X!S5      nU R                  [        S/UR                  5       Q76 U5        g)z¬
When a connection is accepted over IPv4, the server
L{ITransport.getHost} method returns an L{IPv4Address} giving the
address on which the server accepted the connection.
r  r;  r‹  N)rú  rf   r¹  rõ  r
  r¤   r   Úgetpeername)ru   r  ri   ÚhostAddresss       r\   Útest_serverGetHostOnIPv4Ú*TCPPortTestsMixin.test_serverGetHostOnIPv4‘  óV   € ð  ˆ	Ü! $¬¯©¼×8JÑ8JÓKˆØ×:Ñ:¸6ÈiÓXˆØ×Ñœ UÐB¨V×-?Ñ-?Ó-AÒBÀKÕPr[   c                 ó.  • Sn[        U [        R                  [        R                  5      nU R	                  X!S5      nUR                  5       n[        R                  " U[        R                  5      S   nU R                  [        SU/USS Q76 U5        g)z¬
When a connection is accepted over IPv6, the server
L{ITransport.getHost} method returns an L{IPv6Address} giving the
address on which the server accepted the connection.
rT   r;  r   r‹  r–   N)
rú  rf   r¾  rõ  r
  r  rú  rû  r¤   r   ©ru   r  ri   r  rw  rý  s         r\   Útest_serverGetHostOnIPv6Ú*TCPPortTestsMixin.test_serverGetHostOnIPv6œ  ó€   € ð ˆ	Ü! $¬¯©¼×9KÑ9KÓLˆØ×:Ñ:¸6ÈiÓXˆà×!Ñ!Ó#ˆÜ×%Ò% d¬F×,AÑ,AÓBÀ1ÑEˆà×Ñœ U¨HÐ@°t¸A¸B°xÒ@À+ÕNr[   c                 ó>  • [        5       n[        U [        R                  [        R                  5      nU R                  X!S5      nUR                  5       n[        R                  " U[        R                  5      S   nU R                  [        SU/USS Q76 U5        g)zÌ
When a connection is accepted over IPv6, the server
L{ITransport.getHost} method returns an L{IPv6Address} giving the
address on which the server accepted the connection, including the scope
identifier.
r;  r   r‹  r–   N)ra   rú  rf   r¾  rõ  r
  r  rú  rû  r¤   r   r  s         r\   Útest_serverGetHostOnIPv6ScopeIDÚ1TCPPortTestsMixin.test_serverGetHostOnIPv6ScopeID¬  óƒ   € ô ,Ó-ˆ	Ü! $¬¯©¼×9KÑ9KÓLˆØ×:Ñ:¸6ÈiÓXˆà×!Ñ!Ó#ˆÜ×%Ò% d¬F×,AÑ,AÓBÀ1ÑEˆà×Ñœ U¨HÐ@°t¸A¸B°xÒ@À+ÕNr[   c                 óÒ   • Sn[        U [        R                  [        R                  5      nU R	                  X!S5      nU R                  [        S/UR                  5       Q76 U5        g)z¤
When a connection is accepted over IPv4, the server
L{ITransport.getPeer} method returns an L{IPv4Address} giving the
address of the remote end of the connection.
r  r|  r‹  N)rú  rf   r¹  rõ  r
  r¤   r   rö  )ru   r  ri   ÚpeerAddresss       r\   Útest_serverGetPeerOnIPv4Ú*TCPPortTestsMixin.test_serverGetPeerOnIPv4½  r  r[   c                 ó.  • Sn[        U [        R                  [        R                  5      nU R	                  X!S5      nUR                  5       n[        R                  " U[        R                  5      S   nU R                  [        SU/USS Q76 U5        g)z¤
When a connection is accepted over IPv6, the server
L{ITransport.getPeer} method returns an L{IPv6Address} giving the
address on the remote end of the connection.
rT   r|  r   r‹  r–   N)
rú  rf   r¾  rõ  r
  rö  rú  rû  r¤   r   ©ru   r  ri   r  rw  rý  s         r\   Útest_serverGetPeerOnIPv6Ú*TCPPortTestsMixin.test_serverGetPeerOnIPv6È  r  r[   c                 ó>  • [        5       n[        U [        R                  [        R                  5      nU R                  X!S5      nUR                  5       n[        R                  " U[        R                  5      S   nU R                  [        SU/USS Q76 U5        g)zÄ
When a connection is accepted over IPv6, the server
L{ITransport.getPeer} method returns an L{IPv6Address} giving the
address on the remote end of the connection, including the scope
identifier.
r|  r   r‹  r–   N)ra   rú  rf   r¾  rõ  r
  rö  rú  rû  r¤   r   r   s         r\   Útest_serverGetPeerOnIPv6ScopeIDÚ1TCPPortTestsMixin.test_serverGetPeerOnIPv6ScopeIDØ  r  r[   rZ   N) r™   rš   r›   rœ   r�   r+   rµ  r	   r
   r   r   r(  r¨  r¼  rà  r   Úipv6SkipÚipv6SkipReasonrã  rç  rò  r÷  rþ  r  r
  r  r  r  r  r!  r$  rž   rZ   r[   r\   rØ  rØ  à  s8  ‡ ñð @K¸nÐ˜ ¨$¨y©/Ñ!:Ñ;ÓLòDò:ò4ñ ˆH�nÓ%ñ3ó &ð3ñ ˆH�nÓ%ñ2ó &ð2ò$'òLUñ ˆH�nÓ%ñQó &ðQñ ˆH�nÓ%ñSó &ðSò$òL	Qñ ˆH�nÓ%ñOó &ðOñ ˆH�nÓ%ñOó &ðOò 	Qñ ˆH�nÓ%ñOó &ðOñ ˆH�nÓ%ñOó &óOr[   rØ  c                   ó   • \ rS rSrSrg)ÚTCPPortTestsBuilderiê  rZ   N©r™   rš   r›   rœ   rž   rZ   r[   r\   r)  r)  ê  ó   † ò 	r[   r)  c                   ó   • \ rS rSrSrg)ÚTCPFDPortTestsBuilderió  rZ   Nr*  rZ   r[   r\   r-  r-  ó  r+  r[   r-  c                   ó*   • \ rS rSrSrS rS rS rSrg)ÚStopStartReadingProtocoliü  z<
Protocol that pauses and resumes the transport a few times
c                 ó4   • SU l         U R                  S5        g )Nr[   r®   )rr   ÚpauseResumeProducingrŽ   s    r\   ÚconnectionMadeÚ'StopStartReadingProtocol.connectionMade  s   € ØˆŒ	Ø×!Ñ! !Õ$r[   c                 ón  • U R                   R                  5         U R                   R                  5         U(       a5  U R                  R                  R                  SU R                  US-
  5        gU R                  R                  R                  SU R                  R                  R                  U 5        g)z/
Toggle transport read state, then count down.
r   r–   N)	r}  ÚpauseProducingÚresumeProducingrD  rç   rs  r1  ÚreadyÚcallback)ru   Úcounters     r\   r1  Ú-StopStartReadingProtocol.pauseResumeProducing  sz   € ð 	�‰×%Ñ%Ô'Ø�‰×&Ñ&Ô(ÞØ�L‰L× Ñ ×*Ñ*¨1¨d×.GÑ.GÈÐSTÉÕUà�L‰L× Ñ ×*Ñ*¨1¨d¯l©l×.@Ñ.@×.IÑ.IÈ4ÕPr[   c                 ó   • [         R                  " S[        U5      5        U =R                  U-  sl        [        U R                  5      S:X  a0  U R                  R
                  R                  U R                  5        g g )Nzgot datai @  )rH   r…  rƒ   rr   rD  re  r8  rt   s     r\   rµ   Ú%StopStartReadingProtocol.dataReceived  sS   € Ü�Š�
œC ›IÔ&Ø�	Š	�TÑ�	Üˆt�y‰y‹>˜XÓ%Ø�L‰L×Ñ×&Ñ& t§y¡yÕ1ð &r[   r}   N)	r™   rš   r›   rœ   r�   r2  r1  rµ   rž   rZ   r[   r\   r/  r/  ü  s   † ñò%ò	Qõ2r[   r/  c                 ó0   ^ • [        T 5      U 4S j5       nU$ )a  
Decorate a L{ReactorBuilder} test function which tests one reactor and one
connected transport.  Run that test method in the context of
C{connectionMade}, and immediately drop the connection (and end the test)
when that completes.

@param testMethod: A unit test method on a L{ReactorBuilder} test suite;
    taking two additional parameters; a C{reactor} as built by the
    L{ReactorBuilder}, and an L{ITCPTransport} provider.
@type testMethod: 3-argument C{function}

@return: a no-argument test method.
@rtype: 1-argument C{function}
c                 ó€   >^ ^• [        5       m " U UU4S jS[         5      nU" 5       n[        T UT[        5       5        g )Nc                   ó&   >• \ rS rSrU UU4S jrSrg)ÚBoneTransportTest.<locals>.actualTestMethod.<locals>.ServerProtocoli+  c                 óŠ  >•  T" TU R                   U R                  5        U R                  b  U R                  R                  5         TR                  b  TR                  R                  5         g g ! U R                  b  U R                  R                  5         TR                  b  TR                  R                  5         f f = frY   )rç   r}  ÚloseConnection)ru   ÚbuilderÚotherÚ
testMethods    €€€r\   r2  ÚQoneTransportTest.<locals>.actualTestMethod.<locals>.ServerProtocol.connectionMade,  s’   ø€ ð9Ù˜w¨¯©°d·n±nÔEà—~‘~Ñ1ØŸ™×5Ñ5Ô7Ø—‘Ñ2ØŸ™×6Ñ6Õ8ð 3øð —~‘~Ñ1ØŸ™×5Ñ5Ô7Ø—‘Ñ2ØŸ™×6Ñ6Õ8ð 3ús   ƒA1 Á1ACrZ   N©r™   rš   r›   rœ   r2  rž   )rC  rD  rE  s   €€€r\   ÚServerProtocolr@  +  s   ø† ÷9ò 9r[   rH  )r:   rA   r  )rC  rH  ÚserverProtocolrD  rE  s   `  @€r\   ÚactualTestMethodÚ*oneTransportTest.<locals>.actualTestMethod'  s7   ú€ ä#Ó%ˆ÷	9ñ 	9Ô0ô 	9ñ (Ó)ˆÜ ¨¸Ä
ÃÕMr[   r   )rE  rJ  s   ` r\   ÚoneTransportTestrL    s&   ø€ ô  ˆ:ÓôNó ðNð  Ðr[   c                 óæ   • [         R                  " U5      (       a   U R                  X!R                  5       5        gU R                  X!R                  5        U R                  UR                  5        g)a.  
Use the given test to assert that the given transport is actively reading
in the given reactor.

@note: Maintainers; for more information on why this is a function rather
    than a method on a test case, see U{this document on how we structure
    test tools
    <http://twistedmatrix.com/trac/wiki/Design/KeepTestToolsOutOfFixtures>}

@param testCase: a test case to perform the assertion upon.
@type testCase: L{TestCase}

@param reactor: A reactor, possibly one providing L{IReactorFDSet}, or an
    IOCP reactor.

@param transport: An L{ITCPTransport}
N)r)   rž  r˜  rÔ   Úhandlesr  Úreading©rx  rç   r}  s      r\   ÚassertReadingrQ  ;  sT   € ô$ ×Ò ×(Ñ(Ø×Ñ˜)×%7Ñ%7Ó%9Õ:ð 	×Ñ˜)§_¡_Ô5Ø×Ñ˜I×-Ñ-Õ.r[   c                 ó°   • [         R                  " U5      (       a   U R                  X!R                  5       5        gU R	                  UR
                  5        g)a5  
Use the given test to assert that the given transport is I{not} actively
reading in the given reactor.

@note: Maintainers; for more information on why this is a function rather
    than a method on a test case, see U{this document on how we structure
    test tools
    <http://twistedmatrix.com/trac/wiki/Design/KeepTestToolsOutOfFixtures>}

@param testCase: a test case to perform the assertion upon.
@type testCase: L{TestCase}

@param reactor: A reactor, possibly one providing L{IReactorFDSet}, or an
    IOCP reactor.

@param transport: An L{ITCPTransport}
N)r)   rž  ÚassertNotInrÔ   r  rO  rP  s      r\   ÚassertNotReadingrT  U  sB   € ô$ ×Ò ×(Ñ(Ø×Ñ˜Y×(:Ñ(:Ó(<Õ=ð 	×Ñ˜Y×.Ñ.Õ/r[   c                   ó`   • \ rS rSrSr\4rS r\S 5       r	\S 5       r
\S 5       rS rS rS	rg
)ÚTCPConnectionTestsBuilderin  zH
Builder defining tests relating to L{twisted.internet.tcp.Connection}.
c                 ó¬  ^ ^	^
^• [        5       mT R                  5       =m
Tl        SS/nT
R                  R                  nX!;   a%  [
        R                  " 5       (       a  [        S5      e[        Tl	        [        5       Tl        [        5       Tl        T
R                  ST5      nUR                  5       R                  nU	U
U U4S jnU 4S jm	[!        T
SU5      n[#        5       n[$        Ul	        ['        UR)                  U5      TR                  /5      R+                  XS5      nUR-                  [.        R0                  5        T R3                  T
5        g)	z\
This test verifies transport socket read state after multiple
pause/resumeProducing calls.
ÚGlib2ReactorÚGtk2Reactorz.This test is broken on gtk/glib under Windows.r   c                 ó   >• TR                  U S   5        TR                  U S   5        U S   S   U S   S   4n U S   R                  R                  SS-  SS-  -   5        TR                  R	                  TX5      R	                  U4S j5      $ )z4
Send several IOCPReactor's buffers' worth of data.
r   r–   ó   xé    ó   yc                 ó$   >• TR                  5       $ rY   rd  rª  s    €r\   r]   ÚRTCPConnectionTestsBuilder.test_stopStartReading.<locals>.proceed.<locals>.<lambda>‘  s   ø€ ˜GŸL™LœNr[   )r  r}  rñ   re  rj  )Úprotosrl   Úcleanuprç   ru   Úsfs     €€€€r\   ÚproceedÚ@TCPConnectionTestsBuilder.test_stopStartReading.<locals>.proceedˆ  s�   ø€ ð �O‰O˜F 1™IÔ&Ø�O‰O˜F 1™IÔ&Ø˜A‘Y˜q‘\ 6¨!¡9¨Q¡<Ð/ˆFØ�1‰I×Ñ×%Ñ% d¨hÑ&7¸$À(Ñ:KÑ&KÔLØ—7‘7×&Ñ& w°Ó=×IÑIÜ*óð r[   c                 óþ   >• TR                  U SS-  SS-  -   S5        [        [        US   R                  R                  5      [        US   R                  R                  5      [        UR
                  5      /5      $ )zd
Make sure IOCPReactor didn't start several WSARecv operations
that clobbered each other's results.
r[  r\  r]  zdid not get the right datar   r–   )r¤   r   r   r}  rB  r¹  )rr   r`  rl   ru   s      €r\   ra  Ú@TCPConnectionTestsBuilder.test_stopStartReading.<locals>.cleanup”  s}   ø€ ð
 ×ÑØØ˜Ñ! D¨HÑ$5Ñ5Ø,ôô
  ä! &¨¡)×"5Ñ"5×"DÑ"DÓEÜ! &¨¡)×"5Ñ"5×"DÑ"DÓEÜ! $×"4Ñ"4Ó5ðóð r[   r  N)r1   rh  rç   r’  r™   rJ   Ú	isWindowsrO   r/  rè   r   r7  re  rB  r;  rl   r   r/   r0   r   rh   rj  rl  rH   rm  rn  )ru   ÚskippedReactorsÚreactorClassNamerè  rl   rc  ÚccÚcfÚdra  rç   rb  s   `        @@@r\   Útest_stopStartReadingÚ/TCPConnectionTestsBuilder.test_stopStartReadingu  s  û€ ô
 ‹_ˆØ#×0Ñ0Ó2Ð2ˆ�"”*à)¨=Ð9ˆØ"×,Ñ,×5Ñ5ÐØÓ.´8×3EÒ3E×3GÑ3GÜÐKÓLÐLä.ˆŒÜ“:ˆŒÜ“*ˆŒØ×Ñ˜a Ó$ˆØ�y‰y‹{×Ñˆ÷
	ð 
	õ	ô$   ¨°dÓ;ˆÜ‹_ˆÜˆŒÜ˜"Ÿ*™* R›.¨"¯(©(Ð3Ó4×@Ñ@ÀÓLˆØ	�‰”S—W‘WÔØ�‰˜Õ r[   c                 ót   • UR                  5         [        XU5        UR                  5         [        XU5        g)zb
When a L{Server} is connected, its C{resumeProducing} method adds it as
a reader to the reactor.
N)r5  rT  r6  rQ  ©ru   rç   ré   s      r\   Útest_resumeProducingÚ.TCPConnectionTestsBuilder.test_resumeProducing­  s0   € ð 	×ÑÔÜ˜¨Ô/Ø×ÑÔ Ü�d VÕ,r[   c                 ó\   • UR                  5         UR                  5         [        XU5        g)z•
When a L{Server} has already started disconnecting via
C{loseConnection}, its C{resumeProducing} method does not add it as a
reader to its reactor.
N)rB  r6  rT  rp  s      r\   Ú&test_resumeProducingWhileDisconnectingÚ@TCPConnectionTestsBuilder.test_resumeProducingWhileDisconnecting¸  s&   € ð 	×ÑÔØ×ÑÔ Ü˜¨Õ/r[   c                 óš   • UR                  [        [        S5      5      5        [        XU5        UR	                  5         [        XU5        g)z}
When a L{Server} has already lost its connection, its
C{resumeProducing} method does not add it as a reader to its reactor.
ÚdummyN)rï   rI   rð   rT  r6  rp  s      r\   Ú%test_resumeProducingWhileDisconnectedÚ?TCPConnectionTestsBuilder.test_resumeProducingWhileDisconnectedÃ  s<   € ð 	×Ñœg¤i°Ó&8Ó9Ô:Ü˜¨Ô/Ø×ÑÔ Ü˜¨Õ/r[   c                 ó¾   •  " S S[         5      n " S S[         5      nU" 5       n[        XU" 5       [        5       5        U R                  UR                  / SQ5        g)a—  
Alice connects to Bob.  Alice writes some bytes and then shuts down the
connection.  Bob receives the bytes from the connection and then pauses
the transport object.  Shortly afterwards Bob resumes the transport
object.  At that point, Bob is notified that the connection has been
closed.

This is no problem for most reactors.  The underlying event notification
API will probably just remind them that the connection has been closed.
It is a little tricky for win32eventreactor (MsgWaitForMultipleObjects).
MsgWaitForMultipleObjects will only deliver the close notification once.
The reactor needs to remember that notification until Bob resumes the
transport.
c                   ó,   • \ rS rSrS rS rS rS rSrg)ÚQTCPConnectionTestsBuilder.test_connectionLostAfterPausedTransport.<locals>.PauseriÞ  c                 ó   • / U l         g rY   ©ÚeventsrŽ   s    r\   rv   ÚZTCPConnectionTestsBuilder.test_connectionLostAfterPausedTransport.<locals>.Pauser.__init__ß  s	   € Ø �•r[   c                 óº   • U R                   R                  S5        U R                  R                  5         U R                  R                  SU R                  5        g )NÚpausedr   )r  r‚   r}  r5  rç   rs  Úresumer„   s     r\   rµ   Ú^TCPConnectionTestsBuilder.test_connectionLostAfterPausedTransport.<locals>.Pauser.dataReceivedâ  s<   € Ø—‘×"Ñ" 8Ô,Ø—‘×-Ñ-Ô/Ø—‘×&Ñ& q¨$¯+©+Õ6r[   c                 ón   • U R                   R                  S5        U R                  R                  5         g )NÚresumed)r  r‚   r}  r6  rŽ   s    r\   rƒ  ÚXTCPConnectionTestsBuilder.test_connectionLostAfterPausedTransport.<locals>.Pauser.resumeç  s$   € Ø—‘×"Ñ" 9Ô-Ø—‘×.Ñ.Õ0r[   c                 óf   • U R                   R                  S5        [        R                  " X5        g )NÚlost)r  r‚   r:   rï   ©ru   r\  s     r\   rï   Ú`TCPConnectionTestsBuilder.test_connectionLostAfterPausedTransport.<locals>.Pauser.connectionLostë  s"   € à—‘×"Ñ" 6Ô*Ü#×2Ò2°4Õ@r[   r~  N)	r™   rš   r›   rœ   rv   rµ   rƒ  rï   rž   rZ   r[   r\   ÚPauserr|  Þ  s   † ò!ò7ò
1õAr[   rŒ  c                   ó   • \ rS rSrS rSrg)ÚQTCPConnectionTestsBuilder.test_connectionLostAfterPausedTransport.<locals>.Clientið  c                 ón   • U R                   R                  S5        U R                   R                  5         g )Ns   some bytes for you)r}  rñ   rB  rŽ   s    r\   r2  Ú`TCPConnectionTestsBuilder.test_connectionLostAfterPausedTransport.<locals>.Client.connectionMadeñ  s%   € Ø—‘×$Ñ$Ð%:Ô;Ø—‘×-Ñ-Õ/r[   rZ   NrG  rZ   r[   r\   ÚClientrŽ  ð  s   † õ0r[   r‘  )r‚  r†  r‰  N)r:   rA   r  r¤   r  )ru   rŒ  r‘  Úpausers       r\   Ú'test_connectionLostAfterPausedTransportÚATCPConnectionTestsBuilder.test_connectionLostAfterPausedTransportÎ  sL   € ô 	AÔ(ô 	Aô$	0Ô(ô 	0ñ
 “ˆÜ ©f«h¼
»ÔEØ×Ñ˜Ÿ™Ò(EÕFr[   c                 ó¢   • [        [        5       " S S[        5      5       n " S S[        5      n[        X" 5       U" 5       [	        5       5        g)a  
If one side half-closes its connection, and then the other side of the
connection calls C{loseWriteConnection}, and then C{loseConnection} in
{writeConnectionLost}, the connection is closed correctly.

This rather obscure case used to fail (see ticket #3037).
c                   ó    • \ rS rSrS rS rSrg)ÚHTCPConnectionTestsBuilder.test_doubleHalfClose.<locals>.ListenerProtocoli  c                 ó8   • U R                   R                  5         g rY   )r}  ÚloseWriteConnectionrŽ   s    r\   ÚreadConnectionLostÚ[TCPConnectionTestsBuilder.test_doubleHalfClose.<locals>.ListenerProtocol.readConnectionLost  s   € Ø—‘×2Ñ2Õ4r[   c                 ó8   • U R                   R                  5         g rY   ©r}  rB  rŽ   s    r\   ÚwriteConnectionLostÚ\TCPConnectionTestsBuilder.test_doubleHalfClose.<locals>.ListenerProtocol.writeConnectionLost  ó   € Ø—‘×-Ñ-Õ/r[   rZ   N)r™   rš   r›   rœ   rš  rž  rž   rZ   r[   r\   ÚListenerProtocolr—    s   † ò5õ0r[   r¡  c                   ó   • \ rS rSrS rSrg)Ú>TCPConnectionTestsBuilder.test_doubleHalfClose.<locals>.Clienti
  c                 ó8   • U R                   R                  5         g rY   r�  rŽ   s    r\   r2  ÚMTCPConnectionTestsBuilder.test_doubleHalfClose.<locals>.Client.connectionMade  r   r[   rZ   NrG  rZ   r[   r\   r‘  r£  
  s   † õ0r[   r‘  N)r   r%   r:   rA   r  )ru   r¡  r‘  s      r\   Útest_doubleHalfCloseÚ.TCPConnectionTestsBuilder.test_doubleHalfCloseù  sI   € ô 
Ô+Ó	,ô	0Ô2ó 	0ó 
-ð	0ô	0Ô(ô 	0ô
 	  Ð&6Ó&8¹&»(ÄJÃLÕQr[   rZ   N)r™   rš   r›   rœ   r�   r+   rµ  rm  rL  rq  rt  rx  r“  r¦  rž   rZ   r[   r\   rV  rV  n  s`   † ñð &˜Ðò6!ðp ñ-ó ð-ð ñ0ó ð0ð ñ0ó ð0ò)GõVRr[   rV  c                   óZ   • \ rS rSr% Sr\4r\\\	\
         \S'   S rS rS rS rS rS	rg
)ÚWriteSequenceTestsMixini  zE
Test for L{twisted.internet.abstract.FileDescriptor.writeSequence}.
rµ  c                 ó:   • [        USS5      b  X!l        gX!l        g)z�
Set the write buffer size for the given transport, mananing possible
differences (ie, IOCP). Bug #4322 should remove the need of that hack.
ÚwriteBufferSizeN)r  r«  Ú
bufferSize)ru   r}  Úvalues      r\   ÚsetWriteBufferSizeÚ*WriteSequenceTestsMixin.setWriteBufferSize  s    € ô
 �9Ð/°Ó6ÑBØ(-Õ%à#(Õ r[   c                 óö   ^ • U 4S jnT R                  5       nT R                  US[        R                  5      nUR	                  U5        UR                  [        R                  5        T R                  U5        g)zF
C{writeSequence} sends the data even if C{write} hasn't been called.
c                 óf   >^• U u  mpUU4S jnX1l         TR                  R                  / SQ5        g )Nc                 ó�   >• [         R                  " SU -  5        TR                  U S5        TR                  R	                  5         g )Nzdata received: %rs   Some sequence splitted)rH   r…  r¤   r}  rB  )rr   ri   ru   s    €€r\   rµ   Ú^WriteSequenceTestsMixin.test_writeSequeceWithoutWrite.<locals>.connected.<locals>.dataReceived+  s8   ø€ Ü—’Ð+¨dÑ2Ô3Ø× Ñ  Ð'@ÔAØ× Ñ ×/Ñ/Õ1r[   )s   Some s	   sequence s   splitted)rµ   r}  rù   )Ú	protocolsré   rl   rµ   ri   ru   s       @€r\   ra  ÚHWriteSequenceTestsMixin.test_writeSequeceWithoutWrite.<locals>.connected(  s/   ù€ Ø#,Ñ ˆF�Fö2ð
 #/Ôà×Ñ×*Ñ*Ò+PÕQr[   r  N©	rh  ÚgetConnectedClientAndServerrf   r¹  rj  rl  rH   rm  rn  ©ru   ra  rç   rl  s   `   r\   Útest_writeSequeceWithoutWriteÚ5WriteSequenceTestsMixin.test_writeSequeceWithoutWrite#  sY   ø€ õ

	Rð ×#Ñ#Ó%ˆØ×,Ñ,¨W°kÄ6Ç>Á>ÓRˆØ	�‰�iÔ Ø	�‰”S—W‘WÔØ�‰˜Õ r[   c                 óö   ^ • U 4S jnT R                  5       nT R                  US[        R                  5      nUR	                  U5        UR                  [        R                  5        T R                  U5        g)zW
C{writeSequence} with an element in the sequence of type unicode raises
C{TypeError}.
c                 óÒ   >• U u  pnTR                  [        UR                  R                  S/5      nTR	                  [        U5      S5        UR                  R                  5         g )NzUnicode is not kosherzData must be bytes)rŸ  Ú	TypeErrorr}  rù   r¤   r5  rB  )r´  ri   ré   rl   Úexcru   s        €r\   ra  ÚWWriteSequenceTestsMixin.test_writeSequenceWithUnicodeRaisesException.<locals>.connected@  s]   ø€ Ø#,Ñ ˆF˜Dà×#Ñ#Ü˜6×+Ñ+×9Ñ9Ð<SÐ;TóˆCð ×ÑœS ›XÐ';Ô<à×Ñ×+Ñ+Õ-r[   r  Nr¶  r¸  s   `   r\   Ú,test_writeSequenceWithUnicodeRaisesExceptionÚDWriteSequenceTestsMixin.test_writeSequenceWithUnicodeRaisesException:  sX   ø€ õ		.ð ×#Ñ#Ó%ˆØ×,Ñ,¨W°kÄ6Ç>Á>ÓRˆØ	�‰�iÔ Ø	�‰”S—W‘WÔØ�‰˜Õ r[   c                 ó|  ^ ^• [        [        5       " S S5      5       nU" 5       mUU 4S jnT R                  5       nT R                  US[        R
                  5      nUR                  U5        UR                  [        R                  5        T R                  U5        T R                  TR                  SS/5        g)zc
C{writeSequence} pauses its streaming producer if too much data is
buffered, and then resumes it.
c                   ó4   • \ rS rSrSrSrS rS rS rS r	Sr
g)ÚJWriteSequenceTestsMixin.test_streamingProducer.<locals>.SaveActionProduceriW  Nc                 ó   • / U l         g rY   ©ÚactionsrŽ   s    r\   rv   ÚSWriteSequenceTestsMixin.test_streamingProducer.<locals>.SaveActionProducer.__init__\  ó	   € Ø!�•r[   c                 ó:   • U R                   R                  S5        g )NÚpause©rÇ  r‚   rŽ   s    r\   r5  ÚYWriteSequenceTestsMixin.test_streamingProducer.<locals>.SaveActionProducer.pauseProducing_  s   € Ø—‘×#Ñ# GÕ,r[   c                 óÊ   • U R                   R                  S5        U R                  R                  R	                  5         U R
                  R                  R                  5         g )Nrƒ  )rÇ  r‚   ri   r}  ÚunregisterProducerré   rB  rŽ   s    r\   r6  ÚZWriteSequenceTestsMixin.test_streamingProducer.<locals>.SaveActionProducer.resumeProducingb  sB   € Ø—‘×#Ñ# HÔ-à—‘×%Ñ%×8Ñ8Ô:ð
 —‘×%Ñ%×4Ñ4Õ6r[   c                 ó:   • U R                   R                  S5        g ©Nre  rÌ  rŽ   s    r\   ÚstopProducingÚXWriteSequenceTestsMixin.test_streamingProducer.<locals>.SaveActionProducer.stopProducingl  ó   € Ø—‘×#Ñ# FÕ+r[   rÆ  )r™   rš   r›   rœ   ri   ré   rv   r5  r6  rÓ  rž   rZ   r[   r\   ÚSaveActionProducerrÄ  W  s    † àˆFØˆFò"ò-ò7õ,r[   rÖ  c                 óP  >• U S S u  pUTl         UTl        UR                  R                  TS5        TR	                  TR
                  / 5        TR                  UR                  S5        UR                  R                  S/S-  5        TR	                  TR
                  S/5        g )Nrv  Téô  ó2   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxé   rË  )ri   ré   r}  ÚregisterProducerr¤   rÇ  r®  rù   )r´  ri   ré   Úproducerru   s      €€r\   ra  ÚAWriteSequenceTestsMixin.test_streamingProducer.<locals>.connectedq  s•   ø€ Ø& r¨˜]‰NˆFØ$ˆHŒOØ$ˆHŒOð ×Ñ×-Ñ-¨h¸Ô=Ø×Ñ˜X×-Ñ-¨rÔ2Ø×#Ñ# F×$4Ñ$4°cÔ:Ø×Ñ×*Ñ*¨I¨;¸Ñ+;Ô<Ø×Ñ˜X×-Ñ-°¨yÕ9r[   r  rË  rƒ  N)r   r(   rh  r·  rf   r¹  rj  rl  rH   rm  rn  r¤   rÇ  )ru   rÖ  ra  rç   rl  rÜ  s   `    @r\   Útest_streamingProducerÚ.WriteSequenceTestsMixin.test_streamingProducerQ  s�   ù€ ô 
”]Ó	#÷	,ð 	,ó 
$ð	,ñ. &Ó'ˆö
	:ð ×#Ñ#Ó%ˆØ×,Ñ,¨W°kÄ6Ç>Á>ÓRˆØ	�‰�iÔ Ø	�‰”S—W‘WÔØ�‰˜Ô ð 	×Ñ˜×)Ñ)¨G°XÐ+>Õ?r[   c                 óˆ  ^ ^^• T m[        [        5       " U4S jS5      5       nU" 5       mUU 4S jnT R                  5       nT R                  US[        R
                  5      nUR                  U5        UR                  [        R                  5        T R                  U5        T R                  TR                  SS/5        g)zi
C{writeSequence} pauses its producer if too much data is buffered only
if this is a streaming producer.
c                   ó2   >• \ rS rSrSrS rU 4S jrS rSrg)ÚMWriteSequenceTestsMixin.test_nonStreamingProducer.<locals>.SaveActionProduceri�  Nc                 ó   • / U l         g rY   rÆ  rŽ   s    r\   rv   ÚVWriteSequenceTestsMixin.test_nonStreamingProducer.<locals>.SaveActionProducer.__init__‘  rÉ  r[   c                 ób  >• U R                   R                  S5        U R                   R                  S5      S:X  a%  U R                  R                  R                  5         g TR                  U R                  R                  S5        U R                  R                  R                  S/S-  5        g )Nrƒ  rv  rØ  rÙ  rÚ  )rÇ  r‚   r¯   ri   r}  ÚstopConsumingr®  rù   )ru   r÷  s    €r\   r6  Ú]WriteSequenceTestsMixin.test_nonStreamingProducer.<locals>.SaveActionProducer.resumeProducing”  s{   ø€ Ø—‘×#Ñ# HÔ-Ø—<‘<×%Ñ% hÓ/°1Ó4Ø—K‘K×)Ñ)×7Ñ7Õ9à×+Ñ+¨D¯K©K×,AÑ,AÀ3ÔGØ—K‘K×)Ñ)×7Ñ7¸¸ÀbÑ8HÕIr[   c                 ó:   • U R                   R                  S5        g rÒ  rÌ  rŽ   s    r\   rÓ  Ú[WriteSequenceTestsMixin.test_nonStreamingProducer.<locals>.SaveActionProducer.stopProducingœ  rÕ  r[   rÆ  )	r™   rš   r›   rœ   ri   rv   r6  rÓ  rž   )r÷  s   €r\   rÖ  râ  �  s   ø† àˆFò"õJõ,r[   rÖ  c                 ó�   >• U S   nUTl         UR                  R                  TS5        TR                  TR                  S/5        g )Nr   Frƒ  )ri   r}  rÛ  r¤   rÇ  )r´  ri   rÜ  ru   s     €€r\   ra  ÚDWriteSequenceTestsMixin.test_nonStreamingProducer.<locals>.connected¡  sC   ø€ Ø˜q‘\ˆFØ$ˆHŒOð ×Ñ×-Ñ-¨h¸Ô>Ø×Ñ˜X×-Ñ-°¨zÕ:r[   r  rƒ  N)r   r'   rh  r·  rf   r¹  rj  rl  rH   rm  rn  r¤   rÇ  )ru   rÖ  ra  rç   rl  rÜ  r÷  s   `    @@r\   Útest_nonStreamingProducerÚ1WriteSequenceTestsMixin.test_nonStreamingProducer†  s¢   ú€ ð
 ˆä	”]Ó	#÷	,ó 	,ó 
$ð	,ñ" &Ó'ˆö	;ð ×#Ñ#Ó%ˆØ×,Ñ,¨W°kÄ6Ç>Á>ÓRˆØ	�‰�iÔ Ø	�‰”S—W‘WÔØ�‰˜Ô ð 	×Ñ˜×)Ñ)¨H°hÐ+?Õ@r[   rZ   N)r™   rš   r›   rœ   r�   r+   rµ  r	   r
   r   r   r(  r®  r¹  rÀ  rÞ  rì  rž   rZ   r[   r\   r©  r©    sB   ‡ ñð @K¸nÐ˜ ¨$¨y©/Ñ!:Ñ;ÓLò)ò!ò.!ò.3@õj*Ar[   r©  c                   óH   • \ rS rSrSrS rS rS r\" \	\
5      S 5       rSrg)	Ú"TCPTransportServerAddressTestMixini³  z=
Test mixing for TCP server address building and log prefix.
c                 ó   • [        5       e)z|
Helper method returnine a L{Deferred} firing with a tuple of a client
protocol, a server protocol, and a running TCP port.
)ÚNotImplementedError)ru   rç   r  rø  s       r\   r·  Ú>TCPTransportServerAddressTestMixin.getConnectedClientAndServer¸  s   € ô
 "Ó#Ð#r[   c                 óâ   ^ ^^• UUU 4S jnT R                  5       nT R                  UTU5      nUR                  U5        UR                  [        R
                  5        T R                  U5        g)zD
Helper method to test TCP server addresses on either IPv4 or IPv6.
c                 ó€  >• U u  pn TR                  SUR                  R                  < SUR                  5       R                  < S3[        UR                  5      5        TR                  SUR                  R                  < ST< 3UR                  R                  5        UR                  R                  u  nTR                  UT5        TR                  SUR                  5        TR                  TUR                  5        UR                  R                  5         g ! UR                  R                  5         f = f)Nz<AccumulatingProtocol #z on Ú>zAccumulatingProtocol,Ú,r‹  )r¤   r}  Ú	sessionnor;  rl   r5  ÚlogstrrD  ÚpeerAddressesrß  rÎ  rk   rB  )r´  ri   ré   rl   r  ÚadressClassr  ru   s        €€€r\   ra  ÚHTCPTransportServerAddressTestMixin._testServerAddress.<locals>.connectedÄ  sü   ø€ Ø#,Ñ ˆF˜Dð2Ø× Ò à×'Ñ'×1Ô1°4·<±<³>×3FÔ3FðHä˜×(Ñ(Ó)ôð × Ò à×'Ñ'×1Ô1²9ð>à×$Ñ$×+Ñ+ôð !'§¡× <Ñ <‘�Ø×%Ñ% k°;Ô?Ø× Ñ  ¨×(8Ñ(8Ô9Ø× Ñ  ¨K×,<Ñ,<Ô=ð × Ñ ×/Ñ/Õ1ø�× Ñ ×/Ñ/Õ1ús   ˆC>D! Ä!D=N)rh  r·  rj  rl  rH   rm  rn  )ru   r  rø  rú  ra  rç   rl  s   `` `   r\   Ú_testServerAddressÚ5TCPTransportServerAddressTestMixin._testServerAddress¿  sT   ú€ ÷
	2ð. ×#Ñ#Ó%ˆØ×,Ñ,¨W°iÀÓOˆØ	�‰�iÔ Ø	�‰”S—W‘WÔØ�‰˜Õ r[   c                 óL   • U R                  S[        R                  [        5      $ )z²
L{Server} instances have a string representation indicating on which
port they're running, and the connected address is stored on the
C{peerAddresses} attribute of the factory.
r  )rü  rf   r¹  r   rŽ   s    r\   Útest_serverAddressTCP4Ú9TCPTransportServerAddressTestMixin.test_serverAddressTCP4á  s   € ð ×&Ñ& {´F·N±NÄKÓPÐPr[   c                 ó\   • U R                  [        5       [        R                  [        5      $ )z·
IPv6 L{Server} instances have a string representation indicating on
which port they're running, and the connected address is stored on the
C{peerAddresses} attribute of the factory.
)rü  ra   rf   r¾  r   rŽ   s    r\   Útest_serverAddressTCP6Ú9TCPTransportServerAddressTestMixin.test_serverAddressTCP6é  s%   € ð ×&Ñ&Ü#Ó%¤v§¡¼ó
ð 	
r[   rZ   N)r™   rš   r›   rœ   r�   r·  rü  rÿ  r   r&  r'  r  rž   rZ   r[   r\   rï  rï  ³  s3   † ñò$ò !òDQñ ˆH�nÓ%ñ
ó &ó
r[   rï  c                   ó   • \ rS rSrSrS rSrg)ÚTCPTransportTestsBuilderiõ  zL
Test standard L{ITCPTransport}s built with C{listenTCP} and C{connectTCP}.
c                 ó  ^^
^• [        5       n[        5       Ul        [        5       Ul        [	        5       n[        5       Ul        [        5       Ul        TR                  SXBS9m[        UR                  UR                  /5      nU4S jnUR                  U5        [        UR                  UR                  /5      n[        5       m
U
U4S jn	UR                  U	5        TR                  UTR                  5       R                  U5        T
$ )zy
Return a L{Deferred} firing with a L{MyClientFactory} and
L{MyServerFactory} connected pair, and the listening C{Port}.
r   r  c                 ó(   >• TR                  5         U $ rY   rd  ©r×   rç   s    €r\   re  ÚBTCPTransportTestsBuilder.getConnectedClientAndServer.<locals>.stop	  s   ø€ Ø�L‰LŒNØˆMr[   c                 ó˜   >• U u  p[         R                  " SU-  5        [         R                  " SU-  5        TR                  XT45        g ©Nzclient connected %szserver connected %s©rH   r…  r8  ©r´  ri   ré   rt  rl   s      €€r\   ÚstartÚCTCPTransportTestsBuilder.getConnectedClientAndServer.<locals>.start	  óA   ø€ Ø&‰NˆFÜ�GŠGÐ)¨FÑ2Ô3Ü�GŠGÐ)¨FÑ2Ô3Ø×Ñ˜v¨tÐ4Õ5r[   )rN   r   rr  ri  rM   rB  r   r­  rj  rH  r;  rl   )ru   rç   r  rø  ré   ri   ÚlostDeferredre  ÚstartDeferredr  rt  rl   s    `        @@r\   r·  Ú4TCPTransportTestsBuilder.getConnectedClientAndServerü  sä   ú€ ô
 !Ó"ˆÜ(0«
ˆÔ%Ü(0«
ˆÔ%ä Ó"ˆÜ(0«
ˆÔ%Ü(0«
ˆÔ%à× Ñ   FÐ Ð@ˆä$Ø×*Ñ*¨F×,IÑ,IÐJó
ˆõ	ð 	×Ñ˜TÔ"ä%Ø×*Ñ*¨F×,IÑ,IÐJó
ˆô “:ˆö	6ð 	×!Ñ! %Ô(à×Ñ˜9 d§l¡l£n×&9Ñ&9¸6ÔBàˆr[   rZ   N)r™   rš   r›   rœ   r�   r·  rž   rZ   r[   r\   r  r  õ  s   † ñõ)r[   r  c                   ó&   • \ rS rSrSr\\4rS rSr	g)Ú!AdoptStreamConnectionTestsBuilderi(	  z>
Test server transports built using C{adoptStreamConnection}.
c                 ó¶  ^^^^^• [        5       n[        5       Ul        [        5       m[        5       Tl        [        5       Tl        [	        5       n[        5       Ul        [        5       Ul        TR                  SXBS9mUUU4S jnUR                  R                  U5        [        UR                  TR                  /5      nU4S jnUR                  U5        [        5       mTR                  U5        [        UR                  TR                  /5      n	UU4S jn
U	R                  U
5        TR                  UTR                  5       R                  U5        T$ )a  
Return a L{Deferred} firing with a L{MyClientFactory} and
L{MyServerFactory} connected pair, and the listening C{Port}. The
particularity is that the server protocol has been obtained after doing
a C{adoptStreamConnection} against the original server connection.
r   r  c                 óÈ   >• TR                  U R                  5        TR                  U R                  5        TR                  U R                  R	                  5       TT5        g rY   )rÈ   r}  rÑ   ÚadoptStreamConnectionr—   )r�  rø  rç   ré   s    €€€r\   ÚfirtServerConnectedÚZAdoptStreamConnectionTestsBuilder.getConnectedClientAndServer.<locals>.firtServerConnectedE	  sI   ø€ Ø× Ñ  §¡Ô1Ø× Ñ  §¡Ô1Ø×)Ñ)Ø—‘×&Ñ&Ó(¨-¸õr[   c                 óJ   >• TR                   (       a  TR                  5         U $ rY   )r™  re  r  s    €r\   re  ÚKAdoptStreamConnectionTestsBuilder.getConnectedClientAndServer.<locals>.stopR	  s   ø€ Ø��Ø—‘”ØˆMr[   c                 ó˜   >• U u  p[         R                  " SU-  5        [         R                  " SU-  5        TR                  XT45        g r  r  r  s      €€r\   r  ÚLAdoptStreamConnectionTestsBuilder.getConnectedClientAndServer.<locals>.start`	  r  r[   )rN   r   rr  ri  rM   rB  rj  r   r­  rl  rH  r;  rl   )ru   rç   r  rø  ÚfirstServerri   r  r  re  r  r  rt  rl   ré   s    ` `       @@@r\   r·  Ú=AdoptStreamConnectionTestsBuilder.getConnectedClientAndServer1	  s  ü€ ô &Ó'ˆÜ-5«ZˆÔ*ä Ó"ˆÜ(0«
ˆÔ%Ü(0«
ˆÔ%ä Ó"ˆÜ(0«
ˆÔ%Ü(0«
ˆÔ%à× Ñ   KÐ ÐEˆ÷	ð 	×*Ñ*×6Ñ6Ð7JÔKä$Ø×*Ñ*¨F×,IÑ,IÐJó
ˆõ	ð
 	×Ñ˜TÔ"ä“:ˆØ×Ñ˜DÔ!ä%Ø×*Ñ*¨F×,IÑ,IÐJó
ˆö	6ð 	×!Ñ! %Ô(à×Ñ˜9 d§l¡l£n×&9Ñ&9¸6ÔBØˆr[   rZ   N)
r™   rš   r›   rœ   r�   r)   r*   rµ  r·  rž   rZ   r[   r\   r  r  (	  s   † ñð (¨Ð8Ðõ8r[   r  c                   ó   • \ rS rSrSrS rSrg)ÚServerAbortsTwiceiw	  z
Call abortConnection() twice.
c                 ól   • U R                   R                  5         U R                   R                  5         g rY   )r}  ÚabortConnectionrt   s     r\   rµ   ÚServerAbortsTwice.dataReceived|	  s"   € Ø�‰×&Ñ&Ô(Ø�‰×&Ñ&Õ(r[   rZ   Nr·   rZ   r[   r\   r"  r"  w	  ó   † ñõ)r[   r"  c                   ó   • \ rS rSrSrS rSrg)ÚServerAbortsThenLosesi�	  z6
Call abortConnection() followed by loseConnection().
c                 ól   • U R                   R                  5         U R                   R                  5         g rY   )r}  r$  rB  rt   s     r\   rµ   Ú"ServerAbortsThenLoses.dataReceived†	  s"   € Ø�‰×&Ñ&Ô(Ø�‰×%Ñ%Õ'r[   rZ   Nr·   rZ   r[   r\   r(  r(  �	  ó   † ñõ(r[   r(  c                   ó   • \ rS rSrSrS rSrg)ÚAbortServerWritingProtocoli‹	  z,
Protocol that writes data upon connection.
c                 ó:   • U R                   R                  S5        g)zG
Tell the client that the connection is set up and it's time to abort.
s   readyN©r}  rñ   rŽ   s    r\   r2  Ú)AbortServerWritingProtocol.connectionMade�	  s   € ð 	�‰×Ñ˜XÕ&r[   rZ   N©r™   rš   r›   rœ   r�   r2  rž   rZ   r[   r\   r-  r-  ‹	  s   † ñõ'r[   r-  c                   ó   • \ rS rSrSrS rSrg)ÚReadAbortServerProtocoli—	  z¤
Server that should never receive any data, except 'X's which are written
by the other side of the connection before abortConnection, and so might
possibly arrive.
c                 óH   • UR                  SS5      (       a  [        S5      eg )Nó   Xr[   zUnexpectedly received data.)Úreplacerð   rt   s     r\   rµ   Ú$ReadAbortServerProtocol.dataReceivedž	  s$   € Ø�<‰<˜˜c×"Ñ"ÜÐ9Ó:Ð:ð #r[   rZ   Nr·   rZ   r[   r\   r3  r3  —	  s   † ñõ;r[   r3  c                   ó   • \ rS rSrSrS rSrg)ÚNoReadServeri£	  z�
Stop reading immediately on connection.

This simulates a lost connection that will cause the other side to time
out, and therefore call abortConnection().
c                 ó8   • U R                   R                  5         g rY   )r}  ÚstopReadingrŽ   s    r\   r2  ÚNoReadServer.connectionMade«	  s   € Ø�‰×"Ñ"Õ$r[   rZ   Nr1  rZ   r[   r\   r9  r9  £	  s   † ñõ%r[   r9  c                   ó8   • \ rS rSrSrSrSrS rS rS r	S r
Srg	)
ÚEventualNoReadServeri¯	  zš
Like NoReadServer, except we Wait until some bytes have been delivered
before stopping reading. This means TLS handshake has finished, where
applicable.
Fc                 ó¤   • U R                   (       d?  SU l         U R                  R                  U S5        U R                  R                  S5        g g )NTFó   hello)ÚgotDatar}  rÛ  rñ   rt   s     r\   rµ   Ú!EventualNoReadServer.dataReceived¹	  s;   € Ø�|�|ØˆDŒLØ�N‰N×+Ñ+¨D°%Ô8Ø�N‰N× Ñ  Õ*ð r[   c                 ój   • U R                   (       a  g SU l         U R                  R                  5         g ©NT)ÚstoppedReadingr}  r;  rŽ   s    r\   r6  Ú$EventualNoReadServer.resumeProducing¿	  s&   € Ø××ØØ"ˆÔà�‰×"Ñ"Õ$r[   c                 ó   • g rY   rZ   rŽ   s    r\   r5  Ú#EventualNoReadServer.pauseProducingÆ	  ó   € Ør[   c                 ó   • g rY   rZ   rŽ   s    r\   rÓ  Ú"EventualNoReadServer.stopProducingÉ	  rI  r[   )rA  rE  N)r™   rš   r›   rœ   r�   rA  rE  rµ   r6  r5  rÓ  rž   rZ   r[   r\   r>  r>  ¯	  s'   † ñð €GØ€Nò+ò%òõr[   r>  c                   ó"   • \ rS rSrSrSrS rSrg)ÚBaseAbortingClientiÍ	  z'
Base class for abort-testing clients.
Fc                 óh   • U R                   (       a  [        S5      e[        R                  " X5        g )Nz,BUG: connectionLost was called re-entrantly!)ÚinReactorMethodÚRuntimeErrorr:   rï   rŠ  s     r\   rï   Ú!BaseAbortingClient.connectionLostÔ	  s%   € Ø××ÜÐMÓNÐNÜ×*Ò*¨4Õ8r[   rZ   N)r™   rš   r›   rœ   r�   rO  rï   rž   rZ   r[   r\   rM  rM  Í	  s   † ñð €Oõ9r[   rM  c                   ó   • \ rS rSrSrS rSrg)ÚWritingButNotAbortingClientiÚ	  z
Write data, but don't abort.
c                 ó:   • U R                   R                  S5        g )Nr@  r/  rŽ   s    r\   r2  Ú*WritingButNotAbortingClient.connectionMadeß	  s   € Ø�‰×Ñ˜XÕ&r[   rZ   Nr1  rZ   r[   r\   rS  rS  Ú	  s   † ñõ'r[   rS  c                   ó$   • \ rS rSrSrS rS rSrg)ÚAbortingClientiã	  z1
Call abortConnection() after writing some data.
c                 ó@   • SU l         U R                  5         SU l         g)z6
Some data was received, so the connection is set up.
TFN)rO  ÚwriteAndAbortrt   s     r\   rµ   ÚAbortingClient.dataReceivedè	  s    € ð  $ˆÔØ×ÑÔØ$ˆÕr[   c                 ó°   • U R                   R                  SS-  5        U R                   R                  5         U R                   R                  SS-  5        g )Nr5  i'  ó   Y)r}  rñ   r$  rŽ   s    r\   rY  ÚAbortingClient.writeAndAbortð	  s@   € ð 	�‰×Ñ˜T E™\Ô*Ø�‰×&Ñ&Ô(Ø�‰×Ñ˜T E™\Õ*r[   )rO  N)r™   rš   r›   rœ   r�   rµ   rY  rž   rZ   r[   r\   rW  rW  ã	  s   † ñò%õ+r[   rW  c                   ó   • \ rS rSrSrS rSrg)ÚAbortingTwiceClientiù	  z8
Call abortConnection() twice, after writing some data.
c                 ób   • [         R                  U 5        U R                  R                  5         g rY   )rW  rY  r}  r$  rŽ   s    r\   rY  Ú!AbortingTwiceClient.writeAndAbortþ	  s    € Ü×$Ñ$ TÔ*Ø�‰×&Ñ&Õ(r[   rZ   N©r™   rš   r›   rœ   r�   rY  rž   rZ   r[   r\   r_  r_  ù	  r&  r[   r_  c                   ó   • \ rS rSrSrS rSrg)ÚAbortingThenLosingClienti
  z3
Call abortConnection() and then loseConnection().
c                 ób   • [         R                  U 5        U R                  R                  5         g rY   )rW  rY  r}  rB  rŽ   s    r\   rY  Ú&AbortingThenLosingClient.writeAndAbort
  s    € Ü×$Ñ$ TÔ*Ø�‰×%Ñ%Õ'r[   rZ   Nrb  rZ   r[   r\   rd  rd  
  r+  r[   rd  c                   ó>   • \ rS rSrSrSrSrS rS rS r	S r
S	 rS
rg)ÚProducerAbortingClienti
  z9
Call abortConnection from doWrite, via resumeProducing.
TFc                 ó”   • U R                   R                  SS-  5        SU l        U R                   R                  U S5        SU l        g )Ns   lalalaið TF)r}  rñ   ÚinRegisterProducerrÛ  rŽ   s    r\   rñ   ÚProducerAbortingClient.write
  s=   € Ø�‰×Ñ˜Y¨Ñ/Ô0Ø"&ˆÔØ�‰×'Ñ'¨¨eÔ4Ø"'ˆÕr[   c                 ó$   • U R                  5         g rY   ©rñ   rŽ   s    r\   r2  Ú%ProducerAbortingClient.connectionMade
  ó   € Ø�
‰
�r[   c                 óv   • SU l         U R                  (       d  U R                  R                  5         SU l         g )NTF)rO  rj  r}  r$  rŽ   s    r\   r6  Ú&ProducerAbortingClient.resumeProducing
  s+   € Ø#ˆÔØ×&×&Ø�N‰N×*Ñ*Ô,Ø$ˆÕr[   c                 ó   • SU l         g rD  )ÚproducerStoppedrŽ   s    r\   rÓ  Ú$ProducerAbortingClient.stopProducing$
  s
   € Ø#ˆÕr[   c                 ó    • U R                   (       d  [        S5      eU R                  (       a  [        S5      e[        R                  " X5        g )Nz&BUG: stopProducing() was never called.z(BUG: connectionLost called re-entrantly!)rs  rP  rO  r:   rï   rŠ  s     r\   rï   Ú%ProducerAbortingClient.connectionLost'
  s:   € Ø×#×#ÜÐGÓHÐHØ××ÜÐIÓJÐJÜ×*Ò*¨4Õ8r[   )rO  rj  rs  N)r™   rš   r›   rœ   r�   rO  rs  rñ   r2  r6  rÓ  rï   rž   rZ   r[   r\   rh  rh  
  s,   † ñð €OØ€Oò(òò%ò$õ9r[   rh  c                   óN   • \ rS rSrSrSrSrSrS rS r	S r
S rS	 rS
 rS rSrg)ÚStreamingProducerClienti/
  aÕ  
Call abortConnection() when the other side has stopped reading.

In particular, we want to call abortConnection() only once our local
socket hits a state where it is no longer writeable. This helps emulate
the most common use case for abortConnection(), closing a connection after
a timeout, with write buffers being full.

Since it's very difficult to know when this actually happens, we just
write a lot of data, and assume at that point no more writes will happen.
Fr   c                 ó$   • U R                  5         g rY   rm  rŽ   s    r\   r2  Ú&StreamingProducerClient.connectionMade@
  ro  r[   c                 óœ   • U R                   R                  U S5        [        S5       H!  nU R                   R                  SS-  5        M#     g)zP
Write large amount to transport, then wait for a while for buffers to
fill up.
Téd   s
   1234567890i }  N)r}  rÛ  Úrangerñ   )ru   Úis     r\   rñ   ÚStreamingProducerClient.writeC
  s=   € ð
 	�‰×'Ñ'¨¨dÔ3Ü�s–ˆAØ�N‰N× Ñ  °Ñ!6Ö7ò r[   c                 ó   • SU l         g )NF)r‚  rŽ   s    r\   r6  Ú'StreamingProducerClient.resumeProducingL
  s	   € Øˆ�r[   c                 ó   • g rY   rZ   rŽ   s    r\   rÓ  Ú%StreamingProducerClient.stopProducingO
  rI  r[   c                 ó‚   • U R                   (       a  gSU l         U R                  R                  SU R                  5        g)aÞ  
Called when local buffer fills up.

The goal is to hit the point where the local file descriptor is not
writeable (or the moral equivalent). The fact that pauseProducing has
been called is not sufficient, since that can happen when Twisted's
buffers fill up but OS hasn't gotten any writes yet. We want to be as
close as possible to every buffer (including OS buffers) being full.

So, we wait a bit more after this for Twisted to write out a few
chunks, then abortConnection.
NTg{®Gáz„?)r‚  rç   rs  ÚdoAbortrŽ   s    r\   r5  Ú&StreamingProducerClient.pauseProducingR
  s/   € ð �;�;ØØˆŒð 	�‰×Ñ˜t T§\¡\Õ2r[   c                 ó´   • U R                   (       d  [        R                  " [        S5      5        SU l        U R
                  R                  5         SU l        g )Nz&BUG: We should be paused a this point.TF)r‚  rH   rm  rP  rO  r}  r$  rŽ   s    r\   r…  ÚStreamingProducerClient.doAbortg
  s;   € Ø�{�{Ü�GŠG”LÐ!IÓJÔKØ#ˆÔØ�‰×&Ñ&Ô(Ø$ˆÕr[   c                 óx   • U R                   R                  R                  5         [        R                  " X5        g rY   )ÚotherProtocolr}  ÚstartReadingr:   rï   rŠ  s     r\   rï   Ú&StreamingProducerClient.connectionLostn
  s(   € à×Ñ×$Ñ$×1Ñ1Ô3Ü×*Ò*¨4Õ8r[   )rO  r‚  N)r™   rš   r›   rœ   r�   r‚  ÚextraWritesrO  r2  rñ   r6  rÓ  r5  r…  rï   rž   rZ   r[   r\   rx  rx  /
  s;   † ñ
ð €FØ€KØ€Oòò8òòò3ò*%õ9r[   rx  c                   ó$   • \ rS rSrSrS rS rSrg)ÚStreamingProducerClientLaterit
  zL
Call abortConnection() from dataReceived, after bytes have been
exchanged.
c                 óH   • U R                   R                  S5        SU l        g )Nr@  F)r}  rñ   rA  rŽ   s    r\   r2  Ú+StreamingProducerClientLater.connectionMadez
  s   € Ø�‰×Ñ˜XÔ&Øˆ�r[   c                 óV   • U R                   (       d  SU l         U R                  5         g g rD  )rA  rñ   rt   s     r\   rµ   Ú)StreamingProducerClientLater.dataReceived~
  s   € Ø�|�|ØˆDŒLØ�J‰J�Lð r[   )rA  N©r™   rš   r›   rœ   r�   r2  rµ   rž   rZ   r[   r\   r�  r�  t
  s   † ñò
õr[   r�  c                   ó$   • \ rS rSrSrS rS rSrg)ÚProducerAbortingClientLateri„
  zš
Call abortConnection from doWrite, via resumeProducing.

Try to do so after some bytes have already been exchanged, so we
don't interrupt SSL handshake.
c                 ó   • g rY   rZ   rŽ   s    r\   r2  Ú*ProducerAbortingClientLater.connectionMadeŒ
  s   € àr[   c                 ó$   • U R                  5         g rY   rm  rt   s     r\   rµ   Ú(ProducerAbortingClientLater.dataReceived�
  ro  r[   rZ   Nr”  rZ   r[   r\   r–  r–  „
  s   † ñòõr[   r–  c                   ó   • \ rS rSrSrS rSrg)ÚDataReceivedRaisingClienti”
  zF
Call abortConnection(), and then throw exception, from dataReceived.
c                 óL   • U R                   R                  5         [        S5      e)NÚONO)r}  r$  ÚZeroDivisionErrorrt   s     r\   rµ   Ú&DataReceivedRaisingClient.dataReceived™
  s   € Ø�‰×&Ñ&Ô(Ü Ó&Ð&r[   rZ   Nr·   rZ   r[   r\   rœ  rœ  ”
  s   † ñõ'r[   rœ  c                   ó$   • \ rS rSrSrS rS rSrg)ÚResumeThrowsClientiž
  zD
Call abortConnection() and throw exception from resumeProducing().
c                 óp   • U R                   (       d%  U R                  R                  5         [        S5      eg )Nzono!)rj  r}  r$  rŸ  rŽ   s    r\   r6  Ú"ResumeThrowsClient.resumeProducing£
  s+   € Ø×&×&Ø�N‰N×*Ñ*Ô,Ü# FÓ+Ð+ð 'r[   c                 ó0   • [         R                  " X5        g rY   )r:   rï   rŠ  s     r\   rï   Ú!ResumeThrowsClient.connectionLost¨
  s   € ô 	×*Ò*¨4Õ8r[   rZ   N)r™   rš   r›   rœ   r�   r6  rï   rž   rZ   r[   r\   r¢  r¢  ž
  s   † ñò,õ
9r[   r¢  c                   ó¶  • \ rS rSr% SrSr\\   \S'   SS jr	S r
S rS rS	 rS
 r\" \R"                  R%                  SS5      R'                  5       S:H  =(       a    \R*                  " 5       S5      S 5       r\" \R"                  R%                  SS5      R'                  5       S:H  =(       a    \R*                  " 5       S5      S 5       rS rS rS rS rSrg)ÚAbortConnectionMixini¯
  z/
Unit tests for L{ITransport.abortConnection}.
Nr?  c                 ón  • [         [        4n[        [        4n[        (       a(  U[        R
                  4-   nU[        R
                  4-   nU" 5       nU" 5       nXvl        Xgl        [        XX`R                  5      nU R                  UR                  5       / 5        U R                  UR                  5       / 5        Ub+  U R                  UR                  R                  U4U-   5        O&U R                  UR                  R                  U5        U R                  UR                  R                  U5        g)zÏ
A test runner utility function, which hooks up a matched pair of client
and server protocols.

We then run the reactor until both sides have disconnected, and then
verify that the right exception resulted.
N)r   r   r   r  rR   ÚErrorrŠ  rA   r?  r¤   rØ   ÚgetDelayedCallsrß  ÚdisconnectReasonr­  )	ru   ÚclientClassÚserverClassÚclientConnectionLostReasonÚclientExpectedExceptionsÚserverExpectedExceptionsri   ré   rç   s	            r\   ÚrunAbortTestÚ!AbortConnectionMixin.runAbortTest·
  s  € ô %6´~Ð#FÐ Ü$2´NÐ#CÐ ÷ Š6Ø'?Ä3Ç9Á9À,Ñ'NÐ$Ø'?Ä3Ç9Á9À,Ñ'NÐ$á“ˆÙ“ˆØ%ÔØ%ÔÜ)¨$¸ÇÁÓOˆð 	×Ñ˜×*Ñ*Ó,¨bÔ1Ø×Ñ˜×0Ñ0Ó2°BÔ7à%Ñ1Ø×!Ñ!Ø×'Ñ'×-Ñ-Ø+Ð-Ð0HÑHõð
 ×!Ñ!Ø×'Ñ'×-Ñ-Ð/Gôð 	×Ñ˜f×5Ñ5×;Ñ;Ð=UÕVr[   c                 ó6   • U R                  [        [        5      $ )z‰
abortConnection() is called in dataReceived. The protocol should be
disconnected, but connectionLost should not be called re-entrantly.
)r²  rW  r3  rŽ   s    r\   Útest_dataReceivedAbortÚ+AbortConnectionMixin.test_dataReceivedAbortÜ
  s   € ð
 × Ñ ¤Ô1HÓIÐIr[   c                 ó6   • U R                  [        [        5      $ )zq
abortConnection() is called twice by client.

No exception should be thrown, and the connection will be closed.
)r²  r_  r3  rŽ   s    r\   Ú test_clientAbortsConnectionTwiceÚ5AbortConnectionMixin.test_clientAbortsConnectionTwiceã
  s   € ð × Ñ Ô!4Ô6MÓNÐNr[   c                 ó6   • U R                  [        [        5      $ )z‚
Client calls abortConnection(), followed by loseConnection().

No exception should be thrown, and the connection will be closed.
)r²  rd  r3  rŽ   s    r\   Ú.test_clientAbortsConnectionThenLosesConnectionÚCAbortConnectionMixin.test_clientAbortsConnectionThenLosesConnectionë
  s   € ð × Ñ Ô!9Ô;RÓSÐSr[   c                 ó<   • U R                  [        [        [        S9$ )zq
abortConnection() is called twice by server.

No exception should be thrown, and the connection will be closed.
©r¯  )r²  rS  r"  r   rŽ   s    r\   Ú test_serverAbortsConnectionTwiceÚ5AbortConnectionMixin.test_serverAbortsConnectionTwiceó
  s%   € ð × Ñ Ü'ÜÜ'5ð !ð 
ð 	
r[   c                 ó<   • U R                  [        [        [        S9$ )z‚
Server calls abortConnection(), followed by loseConnection().

No exception should be thrown, and the connection will be closed.
r¾  )r²  rS  r(  r   rŽ   s    r\   Ú.test_serverAbortsConnectionThenLosesConnectionÚCAbortConnectionMixin.test_serverAbortsConnectionThenLosesConnectionÿ
  s%   € ð × Ñ Ü'Ü!Ü'5ð !ð 
ð 	
r[   ÚCIrU   ÚtruezFlaky on macOS on Azure.c                 ó8   • U R                  [        [        5        g)z²
abortConnection() is called in resumeProducing, before any bytes have
been exchanged. The protocol should be disconnected, but
connectionLost should not be called re-entrantly.
N)r²  rh  r:   rŽ   s    r\   Útest_resumeProducingAbortÚ.AbortConnectionMixin.test_resumeProducingAbort  s   € ð 	×ÑÔ0Ô2EÕFr[   c                 ó6   • U R                  [        [        5      $ )z|
abortConnection() is called in resumeProducing, after some
bytes have been exchanged. The protocol should be disconnected.
)r²  r–  r-  rŽ   s    r\   Útest_resumeProducingAbortLaterÚ3AbortConnectionMixin.test_resumeProducingAbortLater  s   € ð × Ñ Ü'Ô)Có
ð 	
r[   c                 ó8   • U R                  [        [        5        g)aC  
abortConnection() triggered by the write buffer being full.

In particular, the server side stops reading. This is supposed
to simulate a realistic timeout scenario where the client
notices the server is no longer accepting data.

The protocol should be disconnected, but connectionLost should not be
called re-entrantly.
N)r²  rx  r9  rŽ   s    r\   Útest_fullWriteBufferÚ)AbortConnectionMixin.test_fullWriteBuffer(  s   € ð 	×ÑÔ1´<Õ@r[   c                 ó6   • U R                  [        [        5      $ )zÕ
abortConnection() is triggered by a write buffer being full.

However, this buffer is filled after some bytes have been exchanged,
allowing a TLS handshake if we're testing TLS. The connection will
then be lost.
)r²  r�  r>  rŽ   s    r\   Ú%test_fullWriteBufferAfterByteExchangeÚ:AbortConnectionMixin.test_fullWriteBufferAfterByteExchange5  s   € ð × Ñ Ô!=Ô?SÓTÐTr[   c                 óž   • U R                  [        [        [        S9  U R	                  [        5      nU R                  [        U5      S5        g)a  
dataReceived calls abortConnection(), and then raises an exception.

The connection will be lost, with the thrown exception
(C{ZeroDivisionError}) as the reason on the client. The idea here is
that bugs should not be masked by abortConnection, in particular
unexpected exceptions.
r¾  r–   N)r²  rœ  r-  rŸ  ÚflushLoggedErrorsr¤   rƒ   ©ru   Úerrorss     r\   Útest_dataReceivedThrowsÚ,AbortConnectionMixin.test_dataReceivedThrows?  sG   € ð 	×ÑÜ%Ü&Ü'8ð 	ñ 	
ð
 ×'Ñ'Ô(9Ó:ˆØ×Ñœ˜V› aÕ(r[   c                 óž   • U R                  [        [        [        S9  U R	                  [        5      nU R                  [        U5      S5        g)a  
resumeProducing calls abortConnection(), and then raises an exception.

The connection will be lost, with the thrown exception
(C{ZeroDivisionError}) as the reason on the client. The idea here is
that bugs should not be masked by abortConnection, in particular
unexpected exceptions.
r¾  r–   N)r²  r¢  r:   rŸ  rÓ  r¤   rƒ   rÔ  s     r\   Útest_resumeProducingThrowsÚ/AbortConnectionMixin.test_resumeProducingThrowsP  sG   € ð 	×ÑÜÜÜ'8ð 	ñ 	
ð
 ×'Ñ'Ô(9Ó:ˆØ×Ñœ˜V› aÕ(r[   rZ   rY   )r™   rš   r›   rœ   r�   r?  r	   r<   r(  r²  rµ  r¸  r»  r¿  rÂ  r   r  ÚenvironÚgetÚlowerrJ   ÚisMacOSXrÇ  rÊ  rÍ  rÐ  rÖ  rÙ  rž   rZ   r[   r\   r¨  r¨  ¯
  sç   ‡ ñð
 ,0€Iˆx˜Ñ(Ó/ô#WòJJòOòTò

ò

ñ Ø
�
‰
�‰�t˜RÓ ×&Ñ&Ó(¨FÑ2×J°x×7HÒ7HÓ7JØ"óñGó	ðGñ Ø
�
‰
�‰�t˜RÓ ×&Ñ&Ó(¨FÑ2×J°x×7HÒ7HÓ7JØ"óñ
ó	ð
òAòUò)õ")r[   r¨  c                   ó,   • \ rS rSrSr\4r\" 5       rSr	g)ÚAbortConnectionTestsib  z-
TCP-specific L{AbortConnectionMixin} tests.
rZ   N)
r™   rš   r›   rœ   r�   r+   rµ  r  r?  rž   rZ   r[   r\   rà  rà  b  s   † ñð &˜Ðá“ƒIr[   rà  c                   ó`   • \ rS rSrSrS r\" \R                  " 5       S5      S 5       r	S r
Srg)	ÚSimpleUtilityTestsio  zB
Simple, direct tests for helpers within L{twisted.internet.tcp}.
c                 óª   • U R                  [        R                  [        SS5      nU R	                  UR
                  S   [        R                  5        g)z÷
L{_resolveIPv6} raises a L{socket.gaierror} (L{socket.EAI_NONAME}) when
invoked with a non-numeric host.  (In other words, it is passing
L{socket.AI_NUMERICHOST} to L{socket.getaddrinfo} and will not
accidentally block if it receives bad input.)
Ú	localhostr–   r   N©rŸ  rf   Úgaierrorr8   r¤   r’   Ú
EAI_NONAME©ru   rm  s     r\   Útest_resolveNumericHostÚ*SimpleUtilityTests.test_resolveNumericHostu  s<   € ð ×Ñ¤§¡´¸{ÈAÓNˆØ×Ñ˜Ÿ™ !™¤f×&7Ñ&7Õ8r[   z@The AI_NUMERICSERV flag is not supported by Microsoft providers.c                 óª   • U R                  [        R                  [        SS5      nU R	                  UR
                  S   [        R                  5        g)z÷
L{_resolveIPv6} raises a L{socket.gaierror} (L{socket.EAI_NONAME}) when
invoked with a non-numeric port.  (In other words, it is passing
L{socket.AI_NUMERICSERV} to L{socket.getaddrinfo} and will not
accidentally block if it receives bad input.)
rT   Úhttpr   Nrå  rè  s     r\   Útest_resolveNumericServiceÚ-SimpleUtilityTests.test_resolveNumericService  s<   € ð ×Ñ¤§¡´¸uÀfÓMˆØ×Ñ˜Ÿ™ !™¤f×&7Ñ&7Õ8r[   c                 óà   • [        SS5      nU R                  [        U5      S5        U R                  US   [        5        U R                  US   [        5        U R                  USS S5        g)zJ
L{_resolveIPv6} discovers the flow info and scope ID of an IPv6
address.
rT   rv  re   r®   N)rT   rv  )r8   r¤   rƒ   rß  r6  rÖ   s     r\   Útest_resolveIPv6Ú#SimpleUtilityTests.test_resolveIPv6Ž  sf   € ô
 ˜e QÓ'ˆØ×Ñœ˜V› aÔ(ð
 	×Ñ˜f Q™i¬Ô-Ø×Ñ˜f Q™i¬Ô-ð 	×Ñ˜  ˜ ZÕ0r[   rZ   N)r™   rš   r›   rœ   r�   ré  r   rJ   rg  rí  rð  rž   rZ   r[   r\   râ  râ  o  s9   † ñò9ñ Ø×ÒÓØJóñ
9óð
9õ1r[   râ  c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚBuffersLogsTestsi   z
Tests for L{_BuffersLogs}.
c                 ó~   • SU l         / U l        [        U R                   U R                  R                  5      U l        g )Nz
name.space)Ú	namespacer  r4   r‚   Ú	logBufferrŽ   s    r\   rê   ÚBuffersLogsTests.setUp¥  s,   € Ø%ˆŒØˆŒÜ% d§n¡n°d·k±k×6HÑ6HÓIˆ�r[   c                 ó¨   • U R                    nUR                  S5        U R                  U R                  5        SSS5        g! , (       d  f       g= f)zR
The context manager's logger does not log to provided observer
inside the block.
úAn eventN)rö  r  r  r  )ru   Úloggers     r\   Útest_buffersInBlockÚ$BuffersLogsTests.test_buffersInBlockª  s5   € ð
 �^Š^˜vØ�K‰K˜
Ô#Ø×Ñ˜TŸ[™[Ô)÷ �^Ž^ús   �-AÁ
Ac                 óv  • U R                    nUR                  S5        U R                  U R                  5        SSS5        U R	                  S[        U R                  5      5        U R                  u  nU R	                  US   S5        U R	                  US   U R                  5        g! , (       d  f       Nv= f)z_
The context manager flushes its buffered logs when the block
terminates without an exception.
rù  Nr–   Ú
log_formatÚlog_namespace)rö  r  r  r  r¤   rƒ   rõ  )ru   rú  Úevents      r\   Útest_flushesOnExitÚ#BuffersLogsTests.test_flushesOnExit³  sŒ   € ð
 �^Š^˜vØ�K‰K˜
Ô#Ø×Ñ˜TŸ[™[Ô)÷ ð 	×Ñ˜œC §¡Ó,Ô-Ø—+‘+‰ˆØ×Ñ˜˜|Ñ,¨jÔ9Ø×Ñ˜˜Ñ/°·±Õ@÷ �^ús   �-B*Â*
B8c                 óì  •  " S S[         5      nU R                  U5         U R                   nUR                  S5        U R	                  U R
                  5        U" 5       e! , (       d  f       O= f SSS5        O! , (       d  f       O= fU R                  S[        U R
                  5      5        U R
                  u  nU R                  US   S5        U R                  US   U R                  5        g)zb
The context manager flushes its buffered logs when the block
terminates because of an exception.
c                   ó   • \ rS rSrSrSrg)ÚGBuffersLogsTests.test_flushesOnExitWithException.<locals>.TestExceptioniÆ  z(
An exception only raised by this test.
rZ   N©r™   rš   r›   rœ   r�   rž   rZ   r[   r\   ÚTestExceptionr  Æ  ó   † ôr[   r  rù  Nr–   rþ  rÿ  )	rð   rŸ  rö  r  r  r  r¤   rƒ   rõ  )ru   r  rú  r   s       r\   Útest_flushesOnExitWithExceptionÚ0BuffersLogsTests.test_flushesOnExitWithExceptionÀ  s·   € ô	œIô 	ð
 ×Ñ˜}Õ-Ø—’ 6Ø—‘˜JÔ'Ø× Ñ  §¡Ô-Ù#“oÐ%÷  •ú�÷ .×-Ö-úð 	×Ñ˜œC §¡Ó,Ô-Ø—+‘+‰ˆØ×Ñ˜˜|Ñ,¨jÔ9Ø×Ñ˜˜Ñ/°·±Õ@s   ¡A=®4A"Á"
A0	Á,A=Á=
B)r  rö  rõ  N)
r™   rš   r›   rœ   r�   rê   rû  r  r	  rž   rZ   r[   r\   ró  ró     s   † ñòJò
*òAõAr[   ró  c                   óT   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)ÚFileDescriptorReservationTestsi×  z*
Tests for L{_FileDescriptorReservation}.
c                 ój   ^ • / T l         T R                  5       T l        U 4S jn[        U5      T l        g )Nc                  ó€   >• T R                   R                  [        T R                  S5      5        T R                   S   $ )NÚwrŠ  )ÚreservedFileObjectsr‚   r3  ÚtempfilerŽ   s   €r\   ÚfakeFileFactoryÚ=FileDescriptorReservationTests.setUp.<locals>.fakeFileFactoryá  s3   ø€ Ø×$Ñ$×+Ñ+¬D°·±ÀÓ,DÔEØ×+Ñ+¨BÑ/Ð/r[   )r  Úmktempr  r5   Ú
reservedFD)ru   r  s   ` r\   rê   Ú$FileDescriptorReservationTests.setUpÝ  s+   ø€ Ø#%ˆÔ ØŸ™›ˆŒõ	0ô 5°_ÓEˆ�r[   c                 ó8   • [        [        U R                  5        g)zQ
L{_FileDescriptorReservation} instances provide
L{_IFileDescriptorReservation}.
N)r   r6   r  rŽ   s    r\   r8  Ú5FileDescriptorReservationTests.test_providesInterfaceç  s   € ô
 	Ô0°$·/±/ÕBr[   c                 ó@  • U R                  [        U R                  5      S5        [        S5       Hj  nU R                  R                  5         U R                  [        U R                  5      S5        U R                  U R                  S   R                  5        Ml     g)zP
Multiple acquisitions without releases open the reservation
file exactly once.
r   rª   r–   N)r¤   rƒ   r  r}  r  Úreserver  rç  )ru   rÉ  s     r\   Útest_reserveOpensFileOnceÚ8FileDescriptorReservationTests.test_reserveOpensFileOnceî  sw   € ð
 	×Ñœ˜T×5Ñ5Ó6¸Ô:ä�r–ˆAØ�O‰O×#Ñ#Ô%Ø×ÑœS ×!9Ñ!9Ó:¸AÔ>Ø×Ñ˜T×5Ñ5°aÑ8×?Ñ?Ö@ò r[   c                 ó  • [        5       nU R                  UR                  5        UR                  5         U R	                  U R
                  R                  5       5        U R
                  R                  5         U R	                  U R
                  R                  5       5        U R                  [        [        5      nU R                  [        U5      S5        U R                  US   R                  R                  [        R                  5        g)zŽ
If reserving the file descriptor fails because of C{EMFILE},
the exception is suppressed but logged and the reservation
remains unavailable.
r–   r   N)r
  rö  r  rþ  r  r  Ú	availabler  rÓ  r  r?  r¤   rƒ   r­  r  r  )ru   r0  rÕ  s      r\   Útest_reserveEMFILELoggedÚ7FileDescriptorReservationTests.test_reserveEMFILELoggedú  s¸   € ô -Ó.ˆ	Ø�‰˜	×)Ñ)Ô*Ø×ÑÔà×Ñ˜Ÿ™×2Ñ2Ó4Ô5Ø�‰×ÑÔ!Ø×Ñ˜Ÿ™×2Ñ2Ó4Ô5à×'Ñ'¬´Ó9ˆØ×Ñœ˜V› aÔ(Ø×Ñ˜ ™Ÿ™×.Ñ.´·±Õ=r[   c                 óŒ   • [         [        [        4 H/  nU4S jn[        U5      nU R	                  XR
                  5        M1     g)z˜
Any exception raised while opening the reserve file that is
not an L{OSError} or L{IOError} whose errno is C{EMFILE} is
allowed through to the caller.
c                 ó6   • U " [         R                  S-   S5      e)Nr–   r  )r  r  )Ú
errorClasss    r\   Ú	failsWithÚWFileDescriptorReservationTests.test_reserveRaisesNonEMFILEExceptions.<locals>.failsWith  s   € Ù ¤§¡°Ñ!1°9Ó=Ð=r[   N)r  r?  r   r5   rŸ  r  )ru   r#  r$  Ú	reserveFDs       r\   Ú%test_reserveRaisesNonEMFILEExceptionsÚDFileDescriptorReservationTests.test_reserveRaisesNonEMFILEExceptions  s?   € ô #¤G¬ZÓ8ˆJð &0ô >ô 3°9Ó=ˆIØ×Ñ˜j×*;Ñ*;Ö<ò 9r[   c                 óÜ   • U R                  U R                  R                  5       5        U R                  R                  5         U R	                  U R                  R                  5       5        g)zE
The reservation is available after the file descriptor is
reserved.
N)r  r  r  r  r  rŽ   s    r\   Útest_availableÚ-FileDescriptorReservationTests.test_available  sH   € ð
 	×Ñ˜Ÿ™×2Ñ2Ó4Ô5Ø�‰×ÑÔ!Ø�‰˜Ÿ™×1Ñ1Ó3Õ4r[   c                 ó°   • U R                  [        5         U R                      SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)zX
A reservation without an open file used as a context manager
raises a L{RuntimeError}.
N)rŸ  rP  r  rŽ   s    r\   Útest_enterFailsWithoutFileÚ9FileDescriptorReservationTests.test_enterFailsWithoutFile$  s8   € ð
 ×Ñœ|Õ,Ø—“Ø<÷ !÷ -Ð,ß •ú÷ -Õ,ús   –A£6¥A¶
A	Á AÁ
Ac                 óz  • U R                   R                  5         U R                  U R                   R                  5       5        U R                      U R	                  U R                   R                  5       5        SSS5        U R                  U R                   R                  5       5        g! , (       d  f       N8= f)zY
Entering a reservation closes its file for the duration of the
context manager's block.
N)r  r  r  r  r  rŽ   s    r\   Ú!test_enterClosesFileExitOpensFileÚ@FileDescriptorReservationTests.test_enterClosesFileExitOpensFile-  su   € ð
 	�‰×ÑÔ!Ø�‰˜Ÿ™×1Ñ1Ó3Ô4Ø�_‹_Ø×Ñ˜TŸ_™_×6Ñ6Ó8Ô9÷ à�‰˜Ÿ™×1Ñ1Ó3Õ4÷ �_ús   Á*B,Â,
B:c                 óø   •  " S S[         5      nU R                  R                  5         U R                  U5         U R                     U" 5       e! , (       d  f       O= f SSS5        g! , (       d  f       g= f)zq
An exception raised within a reservation context manager's
block does not prevent the file from being reopened.
c                   ó   • \ rS rSrSrSrg)ÚSFileDescriptorReservationTests.test_exitOpensFileOnException.<locals>.TestExceptioni>  z&
An exception only used by this test.
rZ   Nr  rZ   r[   r\   r  r4  >  r  r[   r  N)rð   r  r  rŸ  )ru   r  s     r\   Útest_exitOpensFileOnExceptionÚ<FileDescriptorReservationTests.test_exitOpensFileOnException8  sS   € ô	œIô 	ð
 	�‰×ÑÔ!Ø×Ñ˜}Õ-Ø—“Ù#“oÐ%÷ !•ú�÷ .×-Ö-ús   »A+ÁAÁ
A	ÁA+Á+
A9c                 ó´  ^^•  " S S[         5      n " S S[         5      mS/mUU4S jn[        U5      nUR                  5         U R                  UR	                  5       5        U R                  U5         U   U" 5       e! , (       d  f       O= f SSS5        O! , (       d  f       O= fU R                  T5      nU R                  [        U5      S5        g)	z¶
An exception raised while re-opening the reserve file exiting
a reservation's context manager block is suppressed but
logged, allowing an exception raised within the block through.
c                   ó   • \ rS rSrSrSrg)Ú`FileDescriptorReservationTests.test_exitSuppressesReservationException.<locals>.AllowedExceptioniO  z)
The exception allowed out of the block.
rZ   Nr  rZ   r[   r\   ÚAllowedExceptionr9  O  r  r[   r:  c                   ó   • \ rS rSrSrSrg)ÚcFileDescriptorReservationTests.test_exitSuppressesReservationException.<locals>.SuppressedExceptioniT  z5
An exception raised by the file descriptor factory.
rZ   Nr  rZ   r[   r\   ÚSuppressedExceptionr<  T  r  r[   r=  Fc                  óZ   >• TS   (       a  T " 5       eSTS'   [         R                  " 5       $ )Nr   T)ÚioÚBytesIO)r=  Úcalleds   €€r\   Ú+failsWithSuppressedExceptionAfterSecondOpenÚ{FileDescriptorReservationTests.test_exitSuppressesReservationException.<locals>.failsWithSuppressedExceptionAfterSecondOpen[  s(   ø€ Ø�a�yÙ)Ó+Ð+à ��q‘	Ü—z’z“|Ð#r[   Nr–   )	rð   r5   r  r  r  rŸ  rÓ  r¤   rƒ   )ru   r:  rB  r  rÕ  r=  rA  s        @@r\   Ú'test_exitSuppressesReservationExceptionÚFFileDescriptorReservationTests.test_exitSuppressesReservationExceptionH  s³   ù€ ô	œyô 	ô
	¤)ô 	ð
 �ˆö	$ô 0Ø7ó
ˆ
ð 	×ÑÔØ�‰˜
×,Ñ,Ó.Ô/à×ÑÐ/Õ0ÚÙ&Ó(Ð(÷ •ú�÷ 1×0Ö0úð ×'Ñ'Ð(;Ó<ˆØ×Ñœ˜V› aÕ(s   Á6BÁ9BÂ
B	ÂBÂ
B*)r  r  r  N)r™   rš   r›   rœ   r�   rê   r8  r  r  r'  r*  r-  r0  r5  rD  rž   rZ   r[   r\   r  r  ×  s<   † ñòFòCò
Aò>ò$=ò5ò=ò	5ò&õ &)r[   r  c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	Ú"NullFileDescriptorReservationTestsiq  z.
Tests for L{_NullFileDescriptorReservation}.
c                 ó"   • [        5       U l        g rY   )r7   ÚnullReservedFDrŽ   s    r\   rê   Ú(NullFileDescriptorReservationTests.setUpv  s   € Ü<Ó>ˆÕr[   c                 ó8   • [        [        U R                  5        g)zL
L{_NullFileDescriptorReservation} provides
L{_IFileDescriptorReservation}.
N)r   r6   rI  rŽ   s    r\   r8  Ú9NullFileDescriptorReservationTests.test_providesInterfacey  s   € ô
 	Ô0°$×2EÑ2EÕFr[   c                 óV   • U R                  U R                  R                  5       5        g)z7
The null reserved file descriptor is never available.
N©r  rI  r  rŽ   s    r\   r*  Ú1NullFileDescriptorReservationTests.test_available€  s!   € ð 	×Ñ˜×,Ñ,×6Ñ6Ó8Õ9r[   c                 óF  • U R                  U R                  R                  5       5        U R                     U R                  U R                  R                  5       5        SSS5        U R                  U R                  R                  5       5        g! , (       d  f       N8= f)z>
The null reserved file descriptor is a null context manager.
NrN  rŽ   s    r\   Útest_contextManagerÚ6NullFileDescriptorReservationTests.test_contextManager†  sr   € ð 	×Ñ˜×,Ñ,×6Ñ6Ó8Ô9Ø× Ó Ø×Ñ˜T×0Ñ0×:Ñ:Ó<Ô=÷ !à×Ñ˜×,Ñ,×6Ñ6Ó8Õ9÷ !Õ ús   ¶*BÂ
B )rI  N)
r™   rš   r›   rœ   r�   rê   r8  r*  rQ  rž   rZ   r[   r\   rG  rG  q  s   † ñò?òGò:õ:r[   rG  )Âr�   r  r  r?  r  rf   Ú	functoolsr   Útypingr   r   r   r   r	   r
   r   Úunittestr   Úzope.interfacer   r   Úzope.interface.verifyr   r   r)  Útwisted.internet.addressr   r   Útwisted.internet.deferr   r   r   r   r   r   Útwisted.internet.endpointsr   r   Útwisted.internet.errorr   r   r   r   r   r    r!   r"   r#   Útwisted.internet.interfacesr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   Útwisted.internet.protocolr/   r0   r1   Útwisted.internet.tcpr2   r3   r4   r5   r6   r7   r8   Ú&twisted.internet.test.connectionmixinsr9   r:   r;   r<   r=   r>   r?   r@   rA   Ú#twisted.internet.test.reactormixinsrB   rC   rD   Útwisted.internet.testingrE   rF   Útwisted.loggerrG   Útwisted.pythonrH   Útwisted.python.failurerI   Útwisted.python.runtimerJ   Útwisted.test.test_tcprK   rL   rM   rN   Útwisted.trial.unittestrO   rP   rQ   ÚOpenSSLrR   Útwisted.internet.sslrS   r  ÚImportErrorÚsr¾  rõ  rÒ  r&  r'  r  r   r�   rg  Útwisted.internet.testrV   Úwin32GetLinkLocalIPv6Addressesr_   rÃ  rW   ÚposixGetLinkLocalIPv6Addressesra   rh   ro   r    r³   r¹   rá   r   r  r#  r)  r8  r¸  r»  rÀ  rð  rò  rú  rü  r
  r.  r{  r}  r�  rÅ  rÊ  rÐ  rØ  r)  r-  r/  rL  rQ  rT  rV  r©  rï  r  r  ÚglobalsÚupdateÚmakeTestCaseClassesr"  r(  r-  r3  r9  r>  rM  rS  rW  r_  rd  rh  rx  r�  r–  rœ  r¢  r¨  rà  râ  ró  r  rG  rZ   r[   r\   Ú<module>rr     sÏ  ðñó Û 	Û 	Û 	Û Ý ß N× NÑ NÝ ç 1ß ;ã ç =÷÷ ÷ N÷
÷ 
õ 
÷÷ ÷ ñ ÷ MÑ L÷÷ ñ ÷
÷ 
õ 
÷ñ ÷
 DÝ !Ý Ý *Ý +÷ó ÷ KÑ JðÝõ :à€Fà€ðØ�Š�f—o‘o v×'9Ñ'9Ó:€AØ‡F�Fˆ:Ôð
 €HØ€NØ�=Ø‡G�G„Ið ×Ò×ÑÝ2à ,× KÑ KÐà�KðPÝ6ð %1×$OÒ$OÐ!à€Kò:ò"÷$9ñ 9ôx3�hô 3ô2
�8ô 
ñ ˆ]Ó÷)#ð )#ó ð)#ñX ˆMÐ,Ô -ô11�Xô 11ôh-"˜ô -"ô`O�ô Oô,3�*ô 3ñ$ ˆ_Ó÷Nð Nó ðNô.MH˜Ð)=Ð?Uô MHô`
Ð/ô 
ñ ˆ�.Ó!ô7Ð/ó 7ó "ð7ô,p:˜~ô p:ôfÐ 8ô ñ ˆ�.Ó!ô3Ð 8ó 3ó "ð3òô" 	ô ñ: Ð&Ó'Ø‡‚�TÑ÷D*ð D*ó ó (ðD*ñN ˆÐPÓQôN6Ð#6ó N6ó RðN6òbYñx ˆÐPÓQôI/Ð$7ó I/ó RðI/ôXA
Ð 0ô A
÷HMñ MôB	EÐ.ô 	Eô"FÐ.ô "F÷JGOñ GOôT	ØØØØô		ô	ØØØØô		ô2˜xô 2ò6!òH/ò40ô2aR ô aR÷H^Añ ^A÷B?
ñ ?
ôD0Ø&Ð(?Àô0ôfAØ&Ð(?ÀôAñH ƒ	× Ò Ð'×;Ò;Ó=Ô >Ù ƒ	× Ò Ð'×;Ò;Ó=Ô >Ù ƒ	× Ò Ð$×8Ò8Ó:Ô ;Ù ƒ	× Ò Ð&×:Ò:Ó<Ô =Ù ƒ	× Ò Ð*×>Ò>Ó@Ô AÙ ƒ	× Ò Ð*×>Ò>Ó@Ô AÙ ƒ	× Ò Ð*×>Ò>Ó@Ô AÙ ƒ	× Ò Ð)×=Ò=Ó?Ô @Ù ƒ	× Ò Ð2×FÒFÓHÔ Iô)Ð+ô )ô(Ð/ô (ô	'Ð!4ô 	'ô	;Ð8ô 	;ô	%Ð&ô 	%ôÐ.ô ô<
9Ð,ô 
9ô'Ð"4ô 'ô+Ð'ô +ô,)˜.ô )ô(˜~ô (ô9Ð0ô 9ôDB9Ð1ô B9ôJÐ#:ô ô Ð"8ô ô ' ô 'ô9Ð/ô 9÷"p)ñ p)ôf˜>Ð+?ô ñ ƒ	× Ò Ð%×9Ò9Ó;Ô <ñ ˆ�.Ó!ô-1˜ó -1ó "ð-1ô`4AÐ*ô 4Añn ˆÐPÓQôV)Ð%8ó V)ó RðV)ôr:Ð)<õ :øð]` ó ØƒFðûð ó 0Ø€HØ+¨A¨3Ð/†Nûð0ûð& ó /Ù$.Ó!ð/ús<   ÄX% Ä8X4 ÆY Ø%X1Ø0X1Ø4YØ:YÙYÙ	YÙY