ó RtPc@`sÌdZddlmZmZddlmZddlmZddlm Z m Z m Z ddl m Z mZmZmZmZmZddlmZdfd „ƒYZd ee jfd „ƒYZd ee jfd „ƒYZdefd„ƒYZdefd„ƒYZde jfd„ƒYZdejfd„ƒYZdejfd„ƒYZ dejfd„ƒYZ!ej"ee#ƒ r™de_$de _$nej%ee#ƒ r¸de!_$nd„Z&e&ƒdS(sG Tests for implementations of L{IReactorUDP} and L{IReactorMulticast}. i(tdivisiontabsolute_import(tunittest(t intToBytes(tDeferredt gatherResultst maybeDeferred(tprotocoltreactorterrortdefert interfacestudp(truntimetMixincB`s5eZdZdZdZd„Zd„Zd„ZRS(icC`s g|_dS(N(tpackets(tself((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt__init__scC`s?d|_|jdk r;|jd}|_|jdƒndS(Ni(tstartedtstartedDeferredtNonetcallback(Rtd((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt startProtocols cC`s d|_dS(Ni(tstopped(R((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt stopProtocol#sN( t__name__t __module__RRRRRRR(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyRs   tServercB`seZdZdZd„ZRS(icC`sL|jj||fƒ|jdk rH|jd}|_|jdƒndS(N(RtappendtpacketReceivedRR(RtdatataddrR((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytdatagramReceived,sN(RRRRtrefusedR!(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR'stClientcB`s/eZdZdZd„Zd„Zd„ZRS(icC`sF|jj|ƒ|jdk rB|jd}|_|jdƒndS(N(RRRRR(RRR((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR!9scC`s?|jdk r2|jd}|_|j|ƒn||_dS(N(RRterrbacktfailure(RR%R((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytconnectionFailed?scC`sH|jdk r;|jd}|_|jtjdƒƒnd|_dS(Ntyupi(RRR$R tConnectionRefusedErrorR"(RR((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytconnectionRefusedEsN(RRRRR"R!R&R)(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR#4s   t GoodClientcB`seZd„ZRS(cC`sH|jdk r;|jd}|_|jtjdƒƒnd|_dS(NR'i(RRR$R R(R"(RR((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR)Ns(RRR)(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR*LstBadClientErrorcB`seZdZRS(sf Raised by BadClient at the end of every datagramReceived call to try and screw stuff up. (RRt__doc__(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR+Vst BadClientcB`s&eZdZdZd„Zd„ZRS(s A DatagramProtocol which always raises an exception from datagramReceived. Used to test error handling behavior in the reactor for that method. cC`s ||_dS(se Set the Deferred which will be called back when datagramReceived is called. N(R(RR((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt setDeferredescC`sB|jdk r2|jd}|_|j|ƒntdƒ‚dS(NsApplication code is very buggy!(RRRR+(RtbytesR R((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR!msN(RRR,RRR.R!(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR-^s t UDPTestCasecB`sYeZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z RS( c`sStƒ}tjƒ}|_tjd|ddƒ‰‡‡fd†}|j|ƒS(su The C{type} of the host address of a listening L{DatagramProtocol}'s transport is C{"UDP"}. it interfaces 127.0.0.1c`s)ˆjƒ}ˆj|jdƒˆjƒS(NtUDP(tgetHostt assertEqualttypet stopListening(tignoredR (tpR(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt cbStarteds (RR RRRt listenUDPt addCallback(RtserverRR9((R8Rs9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_oldAddressws  c`sqtƒ‰tjƒ}ˆ_tjdˆddƒ‰‡‡‡fd†}‡‡fd†}|j|ƒj|ƒS(s± The L{DatagramProtocol}'s C{startProtocol} and C{stopProtocol} methods are called when its transports starts and stops listening, respectively. iR1s 127.0.0.1c`s0ˆjˆjdƒˆjˆjdƒˆjƒS(Nii(R4RRR6(R7(tport1RR<(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR9sc`sˆjˆjdƒdS(Ni(R4R(R7(RR<(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt cbStopped“s(RR RRRR:R;(RRR9R?((R>RR<s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_startStop†s  c`s_tƒ‰tjƒ}ˆ_tjdˆddƒ}d„‰‡‡fd†}|jˆ|ƒS(sr Re-listening with the same L{DatagramProtocol} re-invokes the C{startProtocol} callback. iR1s 127.0.0.1cS`s |jƒS(N(R6(R7tport((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR9¡sc`s;tjƒ}ˆ_tjdˆddƒ}|jˆ|ƒS(NiR1s 127.0.0.1(R RRRR:R;(R7RR8(R9R<(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR?¤s(RR RRRR:R;(RRR8R?((R9R<s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt test_rebind˜s   c`svtƒ‰tjƒ}ˆ_tjdˆddƒ‰‡‡‡fd†}|j|ƒ‡fd†}|j|ƒ|S(s A L{CannotListenError} exception is raised when attempting to bind a second protocol instance to an already bound port iR1s 127.0.0.1c`sWˆjˆjƒˆjjƒƒtƒ}ˆjtjtjˆjƒj |ddƒdS(NR1s 127.0.0.1( R4R3t transportRt assertRaisesR tCannotListenErrorRR:RA(R7tserver2(RARR<(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR9µs  c`s ˆjƒS(N(R6(R7(RA(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt cbFinished¾s(RR RRRR:R;(RRR9RG((RARR<s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_bindError¬s   c`sØtƒ‰tjƒ}ˆ_tjdˆddƒ‰tƒ‰tjƒ‰ˆ_‡‡‡fd†}|j|ƒ}‡‡fd†}|j|ƒ‡‡‡fd†}|j|ƒ‡‡fd†}|j|ƒ|S(sŽ Datagrams can be sent with the transport's C{write} method and received via the C{datagramReceived} callback method. iR1s 127.0.0.1c`stjdˆddƒˆ_ˆS(NiR1s 127.0.0.1(RR:tport2(R7(tclientt clientStartedR(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytcbServerStartedÐsc`sLjjjdˆjjƒjƒˆjjƒ}ˆjjƒ}tjƒ}ˆ_ˆjjd|j|jfƒdd d|j|jffg‰‡‡‡‡fd†‰tj ˆdƒ|gdt ƒS( Ns 127.0.0.1thellotatbtcc`sGˆrCtjƒ}ˆ_|jˆƒˆjjˆjdƒŒ|SdS(Ni(R RRR;RCtwritetpop(R7tnextClientWrite(t cbClientSendRJt clientWritesR<(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyRTäs  tfireOnOneErrback(RN(RON( RCtconnectR3RAR RRRQthostRt DeferredListtTrue(R7tcAddrtsAddrt serverSend(RJR<(RTRUs9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytcbClientStartedÖs    c`sŠˆjjƒ}ˆjjƒ}ˆjˆjd|j|jffgƒ|j|jf}ˆjˆjd|fd|fd|fgƒdS(NRMRNRORP(RCR3R4RRXRA(R7R[R\t clientAddr(RJRR<(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytcbSendsFinishedõs  c`s4tjtjˆjƒtjˆjjƒgdtƒS(NRV(R RYRR6RIRZ(R7(R>R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyRGs(RR RRRR:R*R;(Rt serverStartedRLRR^R`RG((RJRKR>RR<s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_sendPacketsÄs     c`sÈtƒ‰tjƒ}ˆ_tjdˆddƒ‰tƒ‰tjƒ}ˆ_tjdˆddƒ‰tj||gdtƒ}‡‡‡fd†}|j |ƒ‡‡fd†}|j |ƒ|S(sÎ A L{ConnectionRefusedError} exception is raised when a connection attempt is actively refused by the other end. Note: This test assumes no one is listening on port 80 UDP. iR1s 127.0.0.1RVc`stjƒ}ˆ_ˆjjddƒxCtdƒD]5}ˆjjt|ƒƒˆjjt|ƒdƒq3Wˆj|t j ƒS(Ns 127.0.0.1iPi (s 127.0.0.1iP( R RRRCRWtrangeRQRt assertFailureR R((R7R)ti(RJRR<(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR9!sc`s1tjtjˆjƒtjˆjƒgdtƒS(NRV(R RYRR6RZ(R7(RARI(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyRG/s( R*R RRRR:RRYRZR;(RRKRaRR9RG((RJRARIRR<s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_connectionRefuseds      cC`svtƒ}tjd|ddƒ}|jt|jjddƒ|jjddƒ|jt|jjddƒ|jƒS(s A call to the transport's connect method fails with a L{ValueError} when a non-IP address is passed as the host value. A call to a transport's connect method fails with a L{RuntimeError} when the transport is already connected. iR1s 127.0.0.1t localhostiP( R*RR:RDt ValueErrorRCRWt RuntimeErrorR6(RRJRA((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_badConnect9s   c`sµtjƒ‰‡fd†}ˆj|ƒtƒ‰tjdˆddƒ‰‡fd†}ˆj|ƒˆjƒ‰tt dƒƒ‰g‰‡‡‡‡‡‡‡fd†‰ˆƒˆS(sr When datagramReceived raises an exception it is logged but the port is not disconnected. c`s9ˆjtƒ}ˆjt|ƒddt|ƒfƒdS(s… Flush the exceptions which the reactor should have logged and make sure they're actually there. is'Incorrectly found %d errors, expected 2N(tflushLoggedErrorsR+R4tlen(tignterrs(R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt cbCompletedSsiR1s 127.0.0.1c`s"tjˆjƒj‡fd†ƒS(sƒ Disconnect the port we started and pass on whatever was given to us in case it was a Failure. c`sˆS(N((Rm(tresult(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytds(R RR6taddBoth(Rp(RA(Rps9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt cbCleanup_si<c`sýˆs.yˆjdƒWq.ˆjƒq.Xnˆjˆjddƒtˆjdƒƒ}tjƒ}ˆj |ƒˆjj |ˆj ˆj fƒ‡‡‡‡fd†}‡fd†}|j ||ƒ|jˆjƒtjd|jtjdƒƒ‰dS( s6 Send one packet to the listening BadClient. Set up a 0.1 second timeout to do re-transmits in case the packet is dropped. When two packets have been received by the BadClient, stop sending and let the finalDeferred's callbacks do some assertions. sNot enough packets receivedsUDP Protocol lost its transportic`sMˆjƒˆj|ƒtˆƒdkrBtjdˆjdƒnˆƒdS(s… A packet arrived. Cancel the timeout for it, record it, and maybe finish the test. iiN(tcancelRRlRt callLaterRR(tpacket(t finalDeferredt makeAttempttsucceededAttemptst timeoutCall(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytcbPacketReceivedˆs   c`s ˆƒdS(sÄ The packet wasn't received quickly enough. Try sending another one. It doesn't matter if the packet for which this was the timeout eventually arrives: makeAttempt throws away the Deferred on which this function is the errback, so when datagramReceived callbacks, so it won't be on this Deferred, so it won't raise an AlreadyCalledError. N((terr(Rx(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytebPacketTimeout˜s gš™™™™™¹?s&Timed out in testDatagramReceivedErrorN(tfailR$tfailIfIdenticalRCRRRRR RR.RQRXRAt addCallbackst addErrbackRRuR t TimeoutError(RvtpacketDeferredR{R}(R tattemptsRJRwRxRRy(Rzs9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyRxts$    ( R RR;R-RR:RrR3tlistRc(RRoRs((R R„RJRwRxRARRys9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_datagramReceivedErrorLs     !7cC`ssddd„ƒY}tjdtƒƒ}|ƒ|_|jdd ƒ|j|jgƒ}|jt|ƒdƒdS( si C{''} is an alternative way to say C{'255.255.255.255'} ({socket.gethostbyname("")} returns C{'255.255.255.255'}), so because it becomes a valid IP address, no deprecation warning about passing hostnames to L{twisted.internet.udp.Port.write} needs to be emitted by C{write()} in this case. t fakeSocketcB`seZd„ZRS(cS`sdS(N((Rtfootbar((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytsendto¸s(RRRŠ(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR‡·sittests iÒN((s iÒ( R tPortRtsocketRQt flushWarningsttest_NoWarningOnBroadcastR4Rl(RR‡R8twarnings((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR¯s  ( RRR=R@RBRHRbRfRjR†R(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR0us     J +  ctReactorShutdownInteractioncB`s)eZdZd„Zd„Zd„ZRS(s!Test reactor shutdown interactioncC`s.tƒ|_tjd|jddƒ|_dS(sStart a UDP portiR1s 127.0.0.1N(RR<RR:RA(R((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytsetUpÇs cC`s |jjƒS(sStop the UDP port(RAR6(R((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttearDownÌsc`stjƒ‰tjƒ}ˆj_‡‡fd†}|j|ƒ‡fd†}ˆj|ƒˆjjjdddˆjjjƒjfƒˆS(s0Test reactor shutdown while in a recvfrom() loopc`s*ˆjjjƒtjdˆjdƒdS(Ni(R<RCtconnectionLostRRuRR(R7(tfinishedR(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytpktReceßsc`sˆjƒdS(N(Rk(R7(R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt flushErrorsèsti@s 127.0.0.1( R RR<RR;RCRQR3RA(RtprR–R—((R•Rs9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt testShutdownFromDatagramReceivedÐs   (RRR,R’R“Rš(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR‘Äs  tMulticastTestCasecB`sŸeZd„Zd„Zd„Zd„Zd„Zd„Zd„Ze j j ƒrpe j j ƒ rpde_ nd„Zd „Ze j j ƒrd e_nRS( cC`sqtƒ|_tƒ|_tjd|jƒ|_tjd|jƒ|_|jjj d|jjj ƒj ƒdS(Nis 127.0.0.1( RR<R#RJRtlistenMulticastR>RIRCRWR3RA(R((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR’÷s    cC`s(tt|jjƒt|jjƒgƒS(N(RRR>R6RI(R((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR“scC`scx\|j|jfD]H}|j|jjƒdƒ|jjdƒ|j|jjƒdƒqWdS(Nii(RJR<R4RCtgetTTLtsetTTL(Rto((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttestTTLsc`s¡ˆjˆjjjƒdƒˆjjjƒ‰ˆjjjdƒ}‡‡fd†}|j|ƒ‡‡fd†}|j|ƒ‡fd†}|j|ƒ|S(sv Test that after loopback mode has been set, multicast packets are delivered to their sender. is 225.0.0.250c`s6tƒ}ˆj_ˆjjjddˆjfƒ|S(NRMs 225.0.0.250(RR<RRCRQRA(R7R(R R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytcbJoinedsc`sˆjtˆjjƒdƒˆjjjdƒˆjˆjjjƒdƒˆjjjddˆjfƒt ƒ}t j d|j dƒ|S(NiiRMs 225.0.0.250(R4RlR<RRCtsetLoopbackModetgetLoopbackModeRQRARRRuRR(R7R(R R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytcbPackets c`s ˆjtˆjjƒdƒdS(Ni(R4RlR<R(R7(R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt cbNoPacket)s(R4R<RCR£R3t joinGroupR;(RtjoinedR¡R¤R¥((R Rs9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt test_loopbacks   c`s”ˆjˆjjjƒdƒˆjˆjjjƒdƒˆjjjdƒ}ˆjjjdƒ}t||gƒ}‡fd†}|j|ƒ|S(sK Test C{getOutgoingInterface} and C{setOutgoingInterface}. s0.0.0.0s 127.0.0.1c`s<ˆjˆjjjƒdƒˆjˆjjjƒdƒdS(Ns 127.0.0.1(R4RJRCtgetOutgoingInterfaceR<(R7(R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt cbInterfaces=s(R4RJRCR©R<tsetOutgoingInterfaceRR;(Rtd1td2RpRª((Rs9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_interface0s c`smˆjjjdƒ}‡fd†}|j|ƒ‡fd†}|j|ƒ‡fd†}|j|ƒ|S(sE Test that multicast a group can be joined and left. s 225.0.0.250c`sˆjjjdƒS(Ns 225.0.0.250(RJRCt leaveGroup(R7(R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt clientJoinedLsc`sˆjjjdƒS(Ns 225.0.0.250(R<RCR¦(R7(R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt clientLeftPsc`sˆjjjdƒS(Ns 225.0.0.250(R<RCR¯(R7(R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt serverJoinedTs(RJRCR¦R;(RRR°R±R²((Rs9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_joinLeaveFs   cC`s"|j|jjjdƒtjƒS(sŠ Test that an attempt to join an address which is not a multicast address fails with L{error.MulticastJoinError}. s 127.0.0.1(RdRJRCR¦R tMulticastJoinError(R((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_joinFailure[ssWindows' multicast is wonkyc`s tƒ‰tjdˆƒ‰ˆjjjƒ‰ˆjjjdƒ}‡‡‡fd†}|j|ƒ‡fd†}|j|ƒ‡fd†}|j|ƒ|S(sn Test that a multicast group can be joined and messages sent to and received from it. is 225.0.0.250c`s3tƒ}ˆj_ˆjjddˆjfƒ|S(Ns hello worlds 225.0.0.250(RR<RRCRQRA(R7R(R RPR(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR¡ssc`s"ˆjˆjjdddƒdS(Nis hello world(R4R<R(R7(R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR¤ysc`s)tˆjƒ}|j‡fd†ƒ|S(Nc`sˆS(N((Rm(t passthrough(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyRqs(RR6R;(R¶Rp(R8(R¶s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytcleanup}s(RRRœR<RCR3R¦R;(RR§R¡R¤R·((R RPR8Rs9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_multicasths    c`s÷tƒ‰tjdˆdtƒ‰ˆjƒj‰tƒ‰tjˆˆdtƒ‰d‰tˆjjj ˆƒˆj ˆƒˆj ˆƒgƒ}‡‡‡‡fd†}|j |ƒ‡‡‡fd†}|j |ƒ‡‡fd†}|j |ƒ|S(s¢ Test that multiple sockets can listen on the same multicast port and that they both receive multicast messages directed to that address. itlistenMultiples 225.0.0.250c`sItƒ}ˆ_tƒ}ˆ_ˆjjdˆˆfƒt||gƒS(Ns hello world(RRRCRQR(R7R¬R­(t firstClienttportnot secondClientttheGroup(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR²›sc`s:ˆjˆjdddƒˆjˆjdddƒdS(Nis hello world(R4R(R7(RºR¼R(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyt gotPackets¢sc`s>ttˆjƒtˆjƒgƒ}|j‡fd†ƒ|S(Nc`sˆS(N((Rm(R¶(s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyRq«s(RRR6R;(R¶Rp(t firstPortt secondPort(R¶s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR·§s  ( RRRœRZR3RARR<RCR¦R;Rr(RR§R²R¾R·((RºR¿R»R¼RÀRR½s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyttest_multiListen†s$      sjon non-linux platforms it appears multiple processes can listen, but not multiple sockets in same process?(RRR’R“R R¨R®R³RµR tplatformt isWindowstisVistattodoR¸RÁtskip(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyR›õs   "      )s!This reactor does not support UDPs'This reactor does not support multicastcC`sddl}|jjdƒrŒtdƒjƒ}|jdƒrŒ|jƒd}|jdƒd ddgkr‰tjj }d|_ q‰qŒndS(Nis /proc/versions Linux versionit.t2s&figure out why this fails in linux 2.2( tostpathtexiststopentreadt startswithtsplitR›t testInterfacetim_funcRÅ(RÉtstf((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pytcheckForLinux22»s  N('R,t __future__RRt twisted.trialRttwisted.python.compatRttwisted.internet.deferRRRttwisted.internetRRR R R R ttwisted.pythonR RtDatagramProtocolRtConnectedDatagramProtocolR#R*t ExceptionR+R-tTestCaseR0R‘R›t IReactorUDPRRÆtIReactorMulticastRÔ(((s9/usr/lib/python2.7/dist-packages/twisted/test/test_udp.pyts..  ÿP1À