m %UIc@sPdkZdklZdkZdkZdkZdkZdkZdkZdk Z dk l Z da dZ dZdeifdYZdeifd YZd fd YZd eefd YZdeefdYZdefdYZdeiefdYZdeifdYZdefdYZdefdYZdefdYZdefdYZdefdYZd efd!YZd"efd#YZd$efd%YZd&efd'YZ d(efd)YZ!d*eifd+YZ"d,Z#e$d-jo e#ndS(.N(s test_support(sproxyiWt localhostsMichael Gilfix was here t SocketTCPTestcBstZdZdZRS(NcCsctititi|_|iititidti |it t a |ii ddS(Ni( tsockettAF_INETt SOCK_STREAMtselftservt setsockoptt SOL_SOCKETt SO_REUSEADDRt test_supportt bind_porttHOSTtPORTtlisten(R((t-/data/zmath/lib/python2.4/test/test_socket.pytsetUps cCs|iid|_dS(N(RRtclosetNone(R((RttearDowns (t__name__t __module__RR(((RRs t SocketUDPTestcBstZdZdZRS(NcCsStititi|_|iititidti |it t a dS(Ni( RRt SOCK_DGRAMRRRRR R R R R (R((RR!scCs|iid|_dS(N(RRRR(R((RR's (RRRR(((RRs tThreadableTestcBsMtZdZdZdZdZdZdZdZdZ RS(sThreadable Test class The ThreadableTest class makes it easy to create a threaded client/server pair from an existing unit test. To create a new threaded class from an existing unit test, use multiple inheritance: class NewClass (OldClass, ThreadableTest): pass This class defines two new fixture functions with obvious purposes for overriding: clientSetUp () clientTearDown () Any new test functions within the class must then define tests in pairs, where the test name is preceeded with a '_' to indicate the client portion of the test. Ex: def testFoo(self): # Server portion def _testFoo(self): # Client portion Any exceptions raised by the clients during their tests are caught and transferred to the main thread to alert the testing framework. Note, the server setup function cannot call any blocking functions that rely on the client thread during setup, unless serverExplicityReady() is called just before the blocking call (such as in setting up a client/server connection and performing the accept() in setUp(). cCs4|i|_|i|_|i|_|i|_dS(N(RRt_ThreadableTest__setUpRt_ThreadableTest__tearDownt_setUpt _tearDown(R((Rt__init__Qs   cCs|iidS(sThis method allows the server to explicitly indicate that it wants the client thread to proceed. This is useful if the server is about to execute a blocking routine that is dependent upon the client thread during its setup routine.N(Rt server_readytset(R((RtserverExplicitReadyXscCsti|_ti|_ti|_tid|_|i}|i d}||d}t |d|}ti|i|f|_|i|iip|iin|iidS(Nit.t_(t threadingtEventRRt client_readytdonetQueuetqueuetidt methodnametrfindtitgetattrt test_methodtthreadtstart_new_threadt clientRunt client_threadRtisSetRtwait(RR*R,R.((RR_s  cCsK|i|ii|iip |ii}|i|ndS(N( RRR&R4R(temptytgettmsgtfail(RR7((RRrs   cCs|ii|ii|it|p tdny |Wn%t j o}|i i |nX|i dS(Ns%test_func must be a callable function(RRR4R%Rt clientSetUptcallablet test_funct TypeErrort ExceptiontstrerrorR(tputtclientTearDown(RR;R>((RR1zs      cCs tddS(Ns clientSetUp must be implemented.(tNotImplementedError(R((RR9scCs|iitidS(N(RR&RR/texit(R((RR@s ( RRt__doc__RR RRR1R9R@(((RR+s $     tThreadedTCPSocketTestcBs&tZddZdZdZRS(NtrunTestcCs$ti|d|ti|dS(Nt methodName(RRRRFR(RRF((RRscCstititi|_dS(N(RRRRtcli(R((RR9scCs'|iid|_ti|dS(N(RRGRRRR@(R((RR@s  (RRRR9R@(((RRDs  tThreadedUDPSocketTestcBstZddZdZRS(NREcCs$ti|d|ti|dS(NRF(RRRRFR(RRF((RRscCstititi|_dS(N(RRRRRG(R((RR9s(RRRR9(((RRHs tSocketConnectedTestcBs8tZddZdZdZdZdZRS(NREcCsti|d|dS(NRF(RDRRRF(RRF((RRscCs9ti||i|ii\}}||_dS(N( RDRRR Rtaccepttconntaddrtcli_conn(RRKRL((RRs  cCs'|iid|_ti|dS(N(RRMRRRDR(R((RRs  cCs3ti||iittf|i|_dS(N(RDR9RRGtconnectR R t serv_conn(R((RR9s cCs'|iid|_ti|dS(N(RRORRRDR@(R((RR@s  (RRRRRR9R@(((RRIs     tSocketPairTestcBs8tZddZdZdZdZdZRS(NREcCs'tii|d|ti|dS(NRF(tunittesttTestCaseRRRFR(RRF((RRscCsti\|_|_dS(N(Rt socketpairRRRG(R((RRscCs|iid|_dS(N(RRRR(R((RRs cCsdS(N((R((RR9scCs'|iid|_ti|dS(N(RRGRRRR@(R((RR@s  (RRRRRR9R@(((RRPs     tGeneralModuleTestscBstZdZdZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZdZRS(NcCstititi}t|}|i|i|i|i d}y|iWnt j onX|i ddS(NsSocket proxy still exists( RRRtstproxytpRt assertEqualtfilenoRRtReferenceErrorR8(RRWRU((Rt test_weakrefs  cCsad}d}d}|iti|d|iti|d|iti|ddS(NcOs tidS(N(Rterror(targstkwargs((Rt raise_errorscOs tidS(N(Rtherror(R]R^((Rt raise_herrorscOs tidS(N(Rtgaierror(R]R^((Rtraise_gaierrorssError raising socket exception.(R_RaRcRtfailUnlessRaisesRR\(RR_RaRc((RttestSocketErrors   cCs<titititititititidS(N( RRRRtSOCK_RAWtSOCK_RDMtSOCK_SEQPACKETRR (R((RttestCrucialConstantsscCsti}yti|}Wntij o dSnX|i|iddjdyti |\}}}Wntij o dSnX||g|}ti|}||jo|idndS(NR!isError resolving host to ip.s)Error testing host resolution mechanisms.(Rt gethostnamethostnamet gethostbynametipR\Rtassert_tfindt gethostbyaddrthnametaliasestipaddrstall_host_namestgetfqdntfqhnR8(RRmRkRqRtRvRsRr((RttestHostnameRess    cCsdk}t|dody#|it}titdWq}tj o.|it|jo|i dqyq}XndS(Nt getrefcountis$socket.getnameinfo loses a reference( tsysthasattrRxRtorigRt getnameinfot SystemErrorRR8(RRyR{((RttestRefCountGetNameInfos cCs1ytiddWntij onXdS(Ntxi(Riii(RR|R\(R((RttestInterpreterCrash!scCshtid<tid<tid<tid<}x|iD]\}}d|>d}x6d D].}|i ||@||||@|@qdW||}|i ||@||it|dd >qCWdS( Ni iliiiiiigE#i2Tvi"(iiiiiigE#i2Tv(RthtonltntohlthtonstntohstsizestitemstfunctsizetmaskR,RRXtswappedt assertRaisest OverflowError(RRR,RRRR((RttestNtoH)s6 , cCs.|i}tid jo d }nd}xG|D]6}yti|d }PWq0ti j oq0Xq0Wti ti|}|||yti|d }Wnti j o d}nX||||ti|||ti|d ||dj o|ti|d |ndS(Ntlinux2tfreebsd4tfreebsd5tfreebsd6tdarwintdaytimetqotdtdomaintechottcptudp(RRRRsdarwin(RRR(RRR(RRXteqRytplatformtservicestserviceRt getservbynametportR\tport2tudpportRt getservbyport(RRRRRRR((Rt testGetServBy7s.        cCs|itidti}|i|id|itid|itidti}|i|id|itid|itidti}|i|id|i|i t tid|i t tiddS(Ni itspam( RRXRtgetdefaulttimeoutRRUt gettimeoutRtsetdefaulttimeoutRt ValueErrorR<(RRU((RttestDefaultTimeout[s         cs ttdpdSndkl}lld}|id|d|id|d|id|d |id |d |id |d |id|d|id|d|id|d |id |d dS(Nt inet_pton(s inet_atons inet_ptonsAF_INETcs |S(N(RRta(R(RR(Rt{sts0.0.0.0ss 255.0.255.0ss170.170.170.170ss1.2.3.4ss255.255.255.255( RzRt inet_atontfRRtgRt assertEquals(RRRRR((RRRttestIPv4toStringwscsttdpdSny,dklll}|pdSnWntj o dSnXd}|idd|d|idd|d|iddd |d |id |d dS( NR(s inet_ptonsAF_INET6shas_ipv6cs |S(N(RtAF_INET6R(R(RR(RRstis::s0::0tis1::sEvV $s$45ef:76cb:1a:56ef:afeb:bac:1924:aeae( RzRRRthas_ipv6t ImportErrorRRR(RRRRR((RRRttestIPv6toStrings   csttdpdSndkl}lld}|id|d|id|d|id|d |id |d |id|d|id|d|id|d dS( Nt inet_ntop(s inet_ntoas inet_ntopsAF_INETcs |S(N(RRR(R(RR(RRss1.0.1.0ss 170.85.170.85sUUs255.255.255.255ss1.2.3.4s( RzRt inet_ntoaRRRRRR(RRRRR((RRRttestStringToIPv4scsttdpdSny,dklll}|pdSnWntj o dSnXd}|id|dd|id|ddd |id |d dS( NR(s inet_ntopsAF_INET6shas_ipv6cs |S(N(RRR(R(RR(RRss::Ris::1iss!aef:b01:506:1001:ffff:9997:55:170s Up( RzRRRRRRRR(RRRRR((RRRttestStringToIPv6s   cCsYtititi}|idtdf|i}|i |dtdfdS(Ns0.0.0.0i( RRRtsocktbindR t getsocknametnameRRX(RRR((Rt testSockNames cCsJtititi}|ititi}|i |djddS(Nisinitial mode is reuse( RRRRt getsockoptRR treuseRtfailIf(RRR((RttestGetSockOptscCsctititi}|ititid|ititi}|i |djddS(Niisfailed to set reuse mode( RRRRRRR RRRR(RRR((RttestSetSockOptscCsLtititi}|id|i|iti|i ddS(NiR( RRRRt settimeoutRRRR\tsend(RR((RttestSendAfterCloses  (RRR[ReRiRwR~RRRRRRRRRRRR(((RRTs"     $        t BasicTCPTestcBstZddZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZRS(NREcCsti|d|dS(NRF(RIRRRF(RRF((RRscCs&|iid}|i|tdS(Ni(RRMtrecvR7RXtMSG(RR7((RttestRecvscCs|iitdS(N(RRORR(R((Rt _testRecvscCsL|iittd}|iid}||}|i|tdS(Nii( RRMRtlenRtseg1tseg2R7RX(RRRR7((RttestOverFlowRecvs cCs|iitdS(N(RRORR(R((Rt_testOverFlowRecvscCs,|iid\}}|i|tdS(Ni(RRMtrecvfromR7RLRXR(RR7RL((Rt testRecvFromscCs|iitdS(N(RRORR(R((Rt _testRecvFromscCsX|iittd\}}|iid\}}||}|i |tdS(Nii( RRMRRRRRLRR7RX(RRLRRR7((RttestOverFlowRecvFroms" cCs|iitdS(N(RRORR(R((Rt_testOverFlowRecvFromscCsNd}x-|iid}|pPn||7}q W|i|dddS(NtiiRi(R7RRMRtreadRX(RR7R((Rt testSendAllscCsdd}|ii|dS(NRi(t big_chunkRROtsendall(RR((Rt _testSendAll s cCsettdpdSn|ii}ti|titi}|i d}|i |t dS(Ntfromfdi(RzRRRMRYtfdRRRRRR7RXR(RRRR7((Rt testFromFds cCs|iitdS(N(RRORR(R((Rt _testFromFdscCs&|iid}|i|tdS(Ni(RRMRR7RXR(RR7((Rt testShutdownscCs$|iit|iiddS(Ni(RRORRtshutdown(R((Rt _testShutdown"s(RRRRRRRRRRRRRRRRR(((RRs            t BasicUDPTestcBs8tZddZdZdZdZdZRS(NREcCsti|d|dS(NRF(RHRRRF(RRF((RR(scCs,|iitt}|i|tdS(N(RRRRRR7RX(RR7((RttestSendtoAndRecv+scCs |iitdttfdS(Ni(RRGtsendtoRR R (R((Rt_testSendtoAndRecv0scCs2|iitt\}}|i|tdS(N(RRRRRR7RLRX(RR7RL((RR3scCs |iitdttfdS(Ni(RRGRRR R (R((RR8s(RRRRRRR(((RR&s     tBasicSocketPairTestcBs8tZddZdZdZdZdZRS(NREcCsti|d|dS(NRF(RPRRRF(RRF((RR=scCs&|iid}|i|tdS(Ni(RRRR7RXR(RR7((RR@scCs|iitdS(N(RRGRR(R((RRDscCs|iitdS(N(RRRR(R((RttestSendGscCs&|iid}|i|tdS(Ni(RRGRR7RXR(RR7((Rt _testSendJs(RRRRRRR(((RR;s     tNonBlockingTCPTestscBs\tZddZdZdZdZdZdZdZd Z d Z RS( NREcCsti|d|dS(NRF(RDRRRF(RRF((RRPscCsp|iidti}y|iiWntij onXti}|i ||djddS(Nif1.0s Error setting non-blocking mode.( RRt setblockingttimetstartRJRR\tendRn(RRR((RttestSetBlockingSs  cCsdS(N((R((Rt_testSetBlocking^scCs|iidy|ii\}}Wntij onX|idt i |iggg\}}}|i|jo|ii\}}n|iddS(Nis'Error trying to do non-blocking accept.s'Error trying to do accept after select.( RRRRJRKRLRR\R8tselectRtwriteterr(RRLRRRRK((Rt testAcceptas $cCs'tid|iittfdS(Nf0.10000000000000001(RtsleepRRGRNR R (R((Rt _testAcceptps cCs|ii\}}dS(N(RRRJRKRL(RRLRK((Rt testConnecttscCs*|iid|iittfdS(Ni (RRGRRNR R (R((Rt _testConnectxscCs|ii\}}|idy|itt}Wnt i j onX|i dt i |ggg\}}}||jo)|itt}|i|tn|i ddS(Nis%Error trying to do non-blocking recv.s0Error during select call to non-blocking socket.(RRRJRKRLRRRRR7RR\R8RRRRRX(RRLRRRR7RK((RR|s  ! cCs7|iittftid|iitdS(Nf0.10000000000000001( RRGRNR R RRRR(R((RRs ( RRRRRRRRRRR(((RRNs       tFileObjectClassTestCasecBstZdZddZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZRS(NiREcCsti|d|dS(NRF(RIRRRF(RRF((RRscCs,ti||iid|i|_dS(Ntrb(RIRRRMtmakefiletbufsizet serv_file(R((RRs cCs:|ii|i|iid|_ti|dS(N(RRRRntclosedRRIR(R((RRs  cCs&ti||iid|_dS(Ntwb(RIR9RRORtcli_file(R((RR9s cCs:|ii|i|iid|_ti|dS(N(RRRRnRRRIR@(R((RR@s  cCsL|iittd}|iid}||}|i|tdS(Ni( RRRRRt first_segt second_segR7RX(RRRR7((Rt testSmallReads cCs!|iit|iidS(N(RRRRtflush(R((Rt_testSmallReadscCs#|ii}|i|tdS(N(RRRR7RXR(RR7((Rt testFullReadscCs!|iit|iidS(N(RRRRR(R((Rt _testFullReadscCsJd}x-|iid}|pPn||7}q W|i|tdS(NRi(tbufRRRtcharRXR(RR R ((RttestUnbufferedReadscCs!|iit|iidS(N(RRRRR(R((Rt_testUnbufferedReadscCs#|ii}|i|tdS(N(RRtreadlinetlineRXR(RR((Rt testReadlinescCs!|iit|iidS(N(RRRRR(R((Rt _testReadlinescCs|i|ii dS(N(RRnRR(R((RttestClosedAttrscCs|i|ii dS(N(RRnRR(R((Rt_testClosedAttrs(RRRRRRR9R@RRRR R R RRRR(((RRs              t!UnbufferedFileObjectClassTestCasecBs&tZdZdZdZdZRS(sRepeat the tests from FileObjectClassTestCase with bufsize==0. In this case (and in this case only), it should be possible to create a file object, read a line from it, create another file object, read another line from it, without loss of data in the first file object's buffer. Note that httplib relies on this when reading multiple requests from the same socket.icCsb|ii}|i|dt|iidd|_|ii}|i|dtdS(NsA. RisB. (RRRRRXRRMR(RR((RttestUnbufferedReadlines cCs9|iidt|iidt|iidS(NsA. sB. (RRRRR(R((Rt_testUnbufferedReadlines(RRRCRRR(((RRs  t#LineBufferedFileObjectClassTestCasecBstZdZRS(Ni(RRR(((RRst$SmallBufferedFileObjectClassTestCasecBstZdZRS(Ni(RRR(((RRstTCPTimeoutTestcBstZdZdZRS(Ncs&d}iti|ddS(Ncs!iidiidS(Nf1.0(RRRRJ(R]R^(R(Rt raise_timeoutss*Error generating a timeout exception (TCP)(RRRdRttimeout(RR((RRttestTCPTimeouts cCst}y#|iid|ii}WnQtij o|i dn0ti j o t }n|i dnX|p|i dndS(Nf0.0s%caught timeout instead of error (TCP)s!caught unexpected exception (TCP)s3accept() returned success when we did not expect it( tFalsetokRRRRJtfooRRR8R\tTrue(RRR((RttestTimeoutZero s (RRRR!(((RRs tUDPTimeoutTestcBstZdZdZRS(Ncs&d}iti|ddS(Ncs$iidiiddS(Nf1.0i(RRRR(R]R^(R(RRss*Error generating a timeout exception (UDP)(RRRdRR(RR((RRttestUDPTimeouts cCst}y&|iid|iid}WnQtij o|i dn0ti j o t }n|i dnX|p|i dndS(Nf0.0is%caught timeout instead of error (UDP)s!caught unexpected exception (UDP)s1recv() returned success when we did not expect it( RRRRRRRRRR8R\R (RRR((RR! s (RRR#R!(((RR"s tTestExceptionscBstZdZRS(NcCsq|ittit|ittiti|ittiti|ittitidS(N( RRnt issubclassRR\R=R`RbR(R((RttestExceptionTree0s(RRR&(((RR$.scCsttttg}tidjo|itt gn|it t t t tgttdo|itnti|dS(NtmacRS(RTRRR$ttestsRyRtextendRR"RRRRRRzRtappendRR t run_unittest(R(((Rt test_main7st__main__(%RQttestR RRRR/R#R'RytweakrefRVR R RRRRRRRDRHRIRPRTRRRRRRRRRR"R$R,R( R RRPRRRIRR"RRRR#RHR,RQRyR RVRRR'RR/RRRRRRR$RDRT((Rt?sD          b LDL