Ϫf,dZddlmZddlmZmZmZmZmZddl m Z ddl m Z m Z mZm Z ddlmZddlmZddlmZmZdd lmZmZmZdd lmZ dd l mZeZdd lmZm Z ddl!m"Z"m#Z#ddl$m%Z%ddl&m'Z'm(Z(m)Z)ddl*m+Z+m,Z,ddl-m.Z.m/Z/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5ddl6m7Z7m8Z8m9Z9ddl:m;Z;ddlZ>m?Z?m@Z@mAZAddlBmCZCddlDmEZEmFZFmGZGmHZHddlImJZJddlKmLZLddlMmNZNddlOmPZPmQZQmRZRddlSmTZTddlUmVZVeTdZWd ZXeTdd!ZXGd"d#ZYd$ZZGd%d&e?Z[Gd'd(e=Z\e e2Gd)d*e=Z]Gd+d,eYeCe>Z^Gd-d.eYeCZ_Gd/d0Z`Gd1d2ZaGd3d4ZbGd5d6eaebeCeGZcGd7d8e`ebeCeGZdGd9d:eHeCZeefje^jefje_jefjecjefjedjefjeejGd;dsendmsg extension unavailable, extended UNIX features disabledceZdZdZdZy)UNIXFamilyMixinzK Test-helper defining mixin for things related to AF_UNIX sockets. cd}|j}t|||||}|j|jt t |j |y)z} Assert that the mode of the created unix socket is set to the mode specified to the reactor method. i)modeN) buildReactorgetattr stopListening assertEqualrrst_mode)self methodNamepathfactoryrBreactorunixPorts A/usr/lib/python3/dist-packages/twisted/internet/test/test_unix.py _modeTestzUNIXFamilyMixin._modeTestOsY ##%/77J/gDI  d!3!34d;N)__name__ __module__ __qualname____doc__rOrPrNr@r@Js  >rPN)rQrRrSrTrr'r]rrrr__annotations__rdrhrUrPrNr\r\bs7@J?V?V>X$y/!:;X1?rPr\c&eZdZdZdZdZdZdZy)SendFileDescriptorz L{SendFileDescriptorAndBytes} sends a file descriptor and optionally some normal bytes and then closes its connection. @ivar reason: The reason the connection was lost, after C{connectionLost} is called. Nc ||_||_y)z @param fd: A C{int} giving a file descriptor to send over the connection. @param data: A C{str} giving data to send over the connection, or L{None} if no data is to be sent. N)fddata)rHrmrns rN__init__zSendFileDescriptor.__init__s rPc|jj|j|jr%|jj |j|jj y)zn Send C{self.fd} and, if it is not L{None}, C{self.data}. Then close the connection. N) transportsendFileDescriptorrmrnwriteloseConnectionrHs rNconnectionMadez!SendFileDescriptor.connectionMadesG ))$''2 99 NN  + %%'rPc>tj||||_yN)r,connectionLostreasonrHrzs rNryz!SendFileDescriptor.connectionLosts**48 rP)rQrRrSrTrzrorvryrUrPrNrkrkxsF (rPrkc0eZdZdZdZdZdZdZdZdZ y)ReceiveFileDescriptora} L{ReceiveFileDescriptor} provides an API for waiting for file descriptors to be received. @ivar reason: The reason the connection was lost, after C{connectionLost} is called. @ivar waiting: A L{Deferred} which fires with a file descriptor once one is received, or with a failure if the connection is lost with no descriptor arriving. Ncz|jt|_|jSt|jS)z Return a L{Deferred} which will fire with the next file descriptor received, or with a failure if the connection is or has already been lost. )rzrwaitingrrus rNwaitForDescriptorz'ReceiveFileDescriptor.waitForDescriptors0 ;; #:DL<<  $ $rPcH|jj|d|_y)z Fire the waiting Deferred, initialized by C{waitForDescriptor}, with the file descriptor just received. N)rcallback)rH descriptors rNfileDescriptorReceivedz,ReceiveFileDescriptor.fileDescriptorReceiveds j) rPc |j9|jjttd|dd|_yy)a_ Fail the waiting Deferred, if it has not already been fired by C{fileDescriptorReceived}. The bytes sent along with a file descriptor are guaranteed to be delivered to the protocol's C{dataReceived} method only after the file descriptor has been delivered to the protocol's C{fileDescriptorReceived}. NzReceived bytes (z) before descriptor.)rerrbackr7 ExceptionrHrns rN dataReceivedz"ReceiveFileDescriptor.dataReceivedsF << # LL  $4TH **48 << # LL  (DL rP) rQrRrSrTrzrrrrryrUrPrNr}r}s' FG %   rPr}ceZdZdZefZeZdZe e j ddZ dZ e e j ddZdZe e edZe d d d Ze e ed Zd Ze e edZe e j.de e edZe e edZe e edZe e edZy)UNIXTestsBuilderz= Builder defining tests relating to L{IReactorUNIX}. cV|jd|jty)zs The UNIX socket created by L{IReactorUNIX.listenUNIX} is created with the mode specified. listenUNIXN)rOrr*rus rN test_modezUNIXTestsBuilder.test_modes |T[[]MODrP8Abstract namespace UNIX sockets only supported on Linux.ct|}|j}|jd|zt}|j |j t d|zy)z On Linux, a UNIX socket path may begin with C{''} to indicate a socket in the abstract namespace. L{IReactorUNIX.listenUNIX} accepts such a path. N)rZrCrr*rFgetHostrrHrJrLports rN#test_listenOnLinuxAbstractNamespacez4UNIXTestsBuilder.test_listenOnLinuxAbstractNamespacesST"##%!!$+}? TD[)ABrPcd}|jtjd||j}|j t 5|j dtdddy#1swYyxYw)z L{IReactorUNIX.listenUNIX} raises L{CannotListenError} if the underlying port's createInternetSocket raises a socket error. ctd)Nz FakeBasePort forced socket.error)OSErrorrus rNraiseSocketErrorz=UNIXTestsBuilder.test_listenFailure..raiseSocketErrors<= =rPcreateInternetSocketznot-usedN)patchrBasePortrC assertRaisesr!rr*)rHrrLs rNtest_listenFailurez#UNIXTestsBuilder.test_listenFailuresc  > 4=="8:JK##%   0 1 <   z=? ; < < .SaveAddressct|j|j|_|j y)N)hostpeer)dictrgetPeer addressesrt)rHrqs rNmakeConnectionzCUNIXTestsBuilder.test_addresses..SaveAddress.makeConnection s3!%"**,93D3D3F"((*rPN)rQrRrSrrUrPrN SaveAddressrs +rPrrrN)r,r0 endpointsrFr)rHrrdrhs rNtest_addresseszUNIXTestsBuilder.test_addressess} +- +ffdnnE ))&163C3CF3KL ))&163C3CF3KLrPcjddlmtjdtj dt }|j }fd}|j||jtd|jfdt|jy) z L{IUNIXTransport.sendFileDescriptor} accepts an integer file descriptor and sends a copy of it to the process reading from the connection. r)fromfd)r>rjunkc|tt}t|jj |j j j |j yrx)r r rrF getsocknameassertNotEqualfileno)rreceivedrsrHs rNcheckDescriptorzAUNIXTestsBuilder.test_sendFileDescriptor..checkDescriptor=sYj';?H *    Q]]_h.B.B.D E    HOO,= >rPz-Sending file descriptor encountered a problemc8jjSrxrqrtignoredrds rNz:UNIXTestsBuilder.test_sendFileDescriptor..M&"2"2"A"A"CrPN) r rbindrkrr}r addCallback addErrbackr:addBothr0r)rHrhdrrrrds` @@@rNtest_sendFileDescriptorz(UNIXTestsBuilder.test_sendFileDescriptor.s " H w#AHHJ8&(  $ $ & ? o& SIJ CDffdnnErPTzfails under LXC in Debian CIcGddt}Gddt}|}|}||_t||||j|j |j dy)z If a L{IUNIXTransport.sendFileDescriptor} call fills up the send buffer, any registered producer is paused. ceZdZdZy)SUNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..DoesNotReadc8|jjyrx)rqpauseProducingrus rNrvzbUNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..DoesNotRead.connectionMadeYs--/rPNrQrRrSrvrUrPrN DoesNotReadrXs 0rPrc.eZdZdZdZdZdZdZdZy)`UNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..SendsManyFileDescriptorsFc.t_jjdfd}t|_jj j_jjdjtdy)NTcjjjjjj dy)Nx)rqrrr rrsrusrNsenderzUNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..SendsManyFileDescriptors.connectionMade..sendercs4NN55dkk6H6H6JKNN((.rPrzSend loop failure) r rqregisterProducerr+taskrLclockstartrr:)rHrs` rNrvzoUNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..SendsManyFileDescriptors.connectionMade_sf$h //d;/(/ "&.."8"8  "--c3FGrPc$|jyrx _disconnectrus rN stopProducingznUNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..SendsManyFileDescriptors.stopProducingk  "rPc$|jyrxrrus rNresumeProducingzpUNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..SendsManyFileDescriptors.resumeProducingnrrPcfd|_|jj|jy)NT)pausedrqunregisterProducerrrus rNrzoUNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..SendsManyFileDescriptors.pauseProducingqs%" 113  "rPc|jj|jj|jjjyrx)rstoprqabortConnectionotherrus rNrzlUNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducing..SendsManyFileDescriptors._disconnectvs6  ..0 $$446rPN) rQrRrSrrvrrrrrUrPrNSendsManyFileDescriptorsr\s!F H # # #  7rPrz*sendFileDescriptor producer was not pausedN)r,rr0r assertTruer)rHrrrdrhs rN-test_sendFileDescriptorTriggersPauseProducingz>UNIXTestsBuilder.test_sendFileDescriptorTriggersPauseProducingQsY 0- 0 7': 7>*+ ffdnnE  'STrPct}t|jdt}g}|j }|j |j |j fdt|||j|j|dt|djt|jjjty)ag If L{IUNIXTransport.sendFileDescriptor} is used to queue a greater number of file descriptors than the number of bytes sent using L{ITransport.write}, the connection is closed and the protocol connected to the transport has its C{connectionLost} method called with a failure wrapping L{FileDescriptorOverrun}. Nc8jjSrxrrs rNrz=UNIXTestsBuilder.test_fileDescriptorOverrun..rrPr)r rkrr}rrappendr0rassertIsInstancer7trapr"rzvaluer#)rHcargorhresultrrds @rNtest_fileDescriptorOverrunz+UNIXTestsBuilder.test_fileDescriptorOverruns#ELLND9&(  $ $ & &--  CDffdnnE fQi1q '( fmm113HIrPcjddlm}ddlm}ddlm}dt tGfddt}Gdd |}|tt\}}|j|j|j|j|} ||| } t\} } t\} }|jt| |jt|d }| | g}||\}}||||| j|j!t#| j$||j't)|j+t)| j$| j$r2|Dcgc] }| }}|j!|| j,y y cc}w) a Drive _SendmsgMixin via sendmsg socket calls to check that L{IFileDescriptorReceiver.fileDescriptorReceived} is called once for each file descriptor received in the ancillary messages. @param ancillaryPacker: A callable that will be given a list of two file descriptors and should return a two-tuple where: The first item is an iterable of zero or more (cmsg_level, cmsg_type, cmsg_data) tuples in the same order as the given list for actual sending via sendmsg; the second item is an integer indicating the expected number of FDs to be received. r socketpair) _SendmsgMixinsendmsgcHt|}|j|jfSrx)rst_devst_ino)rmfss rNdeviceInodeTuplezTUNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..deviceInodeTuplesrBIIryy) )rPceZdZdZfdZy)PUNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeProtocolc g|_g|_yrx)fdsdeviceInodesReceivedrus rNrozYUNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeProtocol.__init__s,.)rPc|jj||jj|t|yrx)rrrr)rHrmrs rNrzgUNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeProtocol.fileDescriptorReceiveds4#))001A"1EFb rPN)rQrRrSror)rsrN FakeProtocolrs  / rPrc.eZdZdZdZdZdZdZdZy)PUNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeReceiverc ||_||_yrx)r protocol)rHsktprotos rNrozYUNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeReceiver.__init__s! % rPcyrxrUrs rN _dataReceivedz^UNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeReceiver._dataReceivedrPcyrxrUrus rNrzXUNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeReceiver.getHostrrPcyrxrUrus rNrzXUNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeReceiver.getPeerrrPcyrxrU)rHos rN _getLogPrefixz^UNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriver..FakeReceiver._getLogPrefixrrPN) rQrRrS bufferSizeror rrrrUrPrN FakeReceiverrs J &    rPrssome data needs to be sentN)r rtwisted.internet.unixrtwisted.python.sendmsgrrr$r,rr addCleanuprrrdoReadrFlenr assertFalseset intersectionr)rHancillaryPackerrrrrr sendSocket recvSocketr receiver fileOneFD fileOneName fileTwoFD fileTwoName dataToSend fdsToSend ancillary expectedCountrmdeviceInodesSentrs @rN)_sendmsgMixinFileDescriptorReceivedDriverz:UNIXTestsBuilder._sendmsgMixinFileDescriptorReceivedDriversx: &72 * , - .  .  = &",G[!A J  (()  (() E2") ;!( ;  ,  ,2  * #29#= = J 2 UYY7 Y44S^DE 99?HI 0 4I I   -u/I/I J IsF0c>ddlmfd}|j|y)z _SendmsgMixin handles multiple file descriptors per recvmsg, calling L{IFileDescriptorReceiver.fileDescriptorReceived} once per received file descriptor. Scenario: single CMSG with two FDs. r SCM_RIGHTSc8ttdg|fg}d}||fS)Niir r)r'r(r)r.s rNrz[UNIXTestsBuilder.test_multiFileDescriptorReceivedPerRecvmsgOneCMSG..ancillaryPackers,$j$t2Hi2HIJIMm+ +rPNrr.r+rHrr.s @rN1test_multiFileDescriptorReceivedPerRecvmsgOneCMSGzBUNIXTestsBuilder.test_multiFileDescriptorReceivedPerRecvmsgOneCMSGs 6 , 66GrPz=Multi control message ancillary sendmsg not supported on Mac.c>ddlmfd}|j|y)z _SendmsgMixin handles multiple file descriptors per recvmsg, calling L{IFileDescriptorReceiver.fileDescriptorReceived} once per received file descriptor. Scenario: two CMSGs with one FD each. rr-c Z|Dcgc]}ttd|f}}d}||fScc}w)Nir1r2)r'rmr(r)r.s rNrz\UNIXTestsBuilder.test_multiFileDescriptorReceivedPerRecvmsgTwoCMSGs..ancillaryPackers9KTUR*j$sB-@UIUMm+ +Vs(Nr3r4s @rN2test_multiFileDescriptorReceivedPerRecvmsgTwoCMSGszCUNIXTestsBuilder.test_multiFileDescriptorReceivedPerRecvmsgTwoCMSGs s 6 , 66GrPc*ddlmd}fd}g}t|j|j t |j|j d||j|dtfd|D}|j|dy ) z _SendmsgMixin handles multiple file descriptors per recvmsg, calling L{IFileDescriptorReceiver.fileDescriptorReceived} once per received file descriptor. Scenario: unsupported CMSGs. rrcg}d}||fS)NrrU)r'r(r)s rNrz[UNIXTestsBuilder.test_multiFileDescriptorReceivedPerRecvmsgBadCMSG..ancillaryPacker0sIMm+ +rPc8d}dg}d}j|||S)Ns some data)NNrPr)ReceivedMessage)r argskwargsrnr(flagsrs rNfakeRecvmsgUnsupportedAncillaryzkUNIXTestsBuilder.test_multiFileDescriptorReceivedPerRecvmsgBadCMSG..fakeRecvmsgUnsupportedAncillary5s*D*+IE**4EB BrPrecvmsgz#received unsupported ancillary datac3,K|] }|dv yw)formatNrU).0eexpectedMessages rN zUUNIXTestsBuilder.test_multiFileDescriptorReceivedPerRecvmsgBadCMSG..DsCqOq{2Csz+Expected message not found in logged eventsN) twisted.pythonrr9rrr;rr+anyr)rHrrAeventsfoundrGrs @@rN1test_multiFileDescriptorReceivedPerRecvmsgBadCMSGzBUNIXTestsBuilder.test_multiFileDescriptorReceivedPerRecvmsgBadCMSG!s~ + ,  C FMM"  6 7I'FG 66G@CFCC LMrPcddlm}|\}}g}t|j|j t |jGddt }||jd}t}t||||j|j|jd|jd|jdd }d } t|j |j"| | } |D]1} | j%D]\} } | | j'| k7s0y|j)d | d t+|dy)z If associated with a protocol which does not provide L{IFileDescriptorReceiver}, file descriptors received by the L{IUNIXTransport} implementation are closed and a warning is emitted. rrceZdZdZy)RUNIXTestsBuilder.test_avoidLeakingFileDescriptors..RecordEndpointAddressesc|jj|_|jj|_t j |yrx)rqr hostAddressr peerAddressrkrvrus rNrvzaUNIXTestsBuilder.test_avoidLeakingFileDescriptors..RecordEndpointAddresses.connectionMade\s:#'>>#9#9#; #'>>#9#9#; "11$7rPNrrUrPrNRecordEndpointAddressesrP[s 8rPrTrFrPrz%(protocolName)s (on %(hostAddress)r) does not provide IFileDescriptorReceiver; closing file descriptor received (from %(peerAddress)r).r,)rRrS protocolNamerDzExpected event (z) not found in logged events ()N)r rr9rrr;rkrr,r0rr setblockingrFrecvrrSrRitemsgetrr )rHr probeClient probeServerrKrTrdrhrDclsName expectedEventlogEventkvs rN test_avoidLeakingFileDescriptorsz1UNIXTestsBuilder.test_avoidLeakingFileDescriptorsGsJ &#-< [FMM"  6 8&8 8 )););)=wG$&ffdnnE  & k..t45 :  (****    H%++- 1 Q'     II" rPchttGfddt}t}t |j d}|}t ||jjt|jdjdt|jddy)z L{IUNIXTransport.sendFileDescriptor} sends file descriptors before L{ITransport.write} sends normal bytes. c$eZdZdZfdZdZy)JUNIXTestsBuilder.test_descriptorDeliveredBeforeBytes..RecordEventsc<tj|g|_yrx)r,rvrKrus rNrvzYUNIXTestsBuilder.test_descriptorDeliveredBeforeBytes..RecordEvents.connectionMades#2248  rPczjt||jjt |yrx)rrrKrtype) innerSelfrrHs rNrzaUNIXTestsBuilder.test_descriptorDeliveredBeforeBytes..RecordEvents.fileDescriptorReceiveds*z2  ''Z(89rPc:|jj|yrx)rKextendrs rNrzWUNIXTestsBuilder.test_descriptorDeliveredBeforeBytes..RecordEvents.dataReceiveds ""4(rPN)rQrRrSrvrrrusrN RecordEventsres ! : )rPrlrrN) rr$r,r rkrr0rrFintrKbytes)rHrlrrdrhs` rN#test_descriptorDeliveredBeforeBytesz4UNIXTestsBuilder.test_descriptorDeliveredBeforeBytess , - ). ) . )#ELLNG<ffdnnE fmmA./ % ab(9":;rPN)rQrRrSrTr'r]r\rrrr=isLinuxrrrrrsendmsgSkipReasonrrrr+r5isMacOSXr9rMrbrprUrPrNrrs' IE H   E C  C < H   EO OM, K*+ F, FD D01.U2.U` K*+J,J.aKF K*+ H, H G K*+ H,  H K*+#N,#NJ K*+J,JX K*+<,?xHHrPN) rQrRrSr'r]rrrrrirrrUrPrNrr s)?Ko$y/!:;MN IrPrceZdZdZy)UNIXPortTestsBuilderz. Tests for L{IReactorUNIX.listenUnix} NrQrRrSrTrUrPrNrr0 rPrceZdZdZy)UNIXFDPortTestsBuilderz3 Tests for L{IReactorUNIX.adoptStreamPort} NrrUrPrNrr;rrPrc(eZdZeeefZdZdZdZ y)%UNIXAdoptStreamConnectionTestsBuilderc|j}ddlm}Gddt}|tt \}}|j d|j|j|j|j|j}|}|j|t|}|j|y)z {IReactorSocket.adoptStreamConnection} returns None if the given factory's buildProtocol returns None. rrceZdZdZy)XUNIXAdoptStreamConnectionTestsBuilder.test_buildProtocolReturnsNone..NoneFactorycyrxrU)rHrs rN buildProtocolzfUNIXAdoptStreamConnectionTestsBuilder.test_buildProtocolReturnsNone..NoneFactory.buildProtocol\srPN)rQrRrSrrUrPrN NoneFactoryr[s rPrFN) rCr rr*rr rWrrradoptStreamConnection assertIsNone) rHrLrrs1s2s1FDrKrs rNtest_buildProtocolReturnsNonezCUNIXAdoptStreamConnectionTestsBuilder.test_buildProtocolReturnsNoneMs##%% - G[1B u ! !yy{-..tWgF &!rPcfd}j}j|dd}|j|j|y)z> Helper method to test UNIX server addresses. c,|\}}} td|jj}jd|jj d|dt |jjd|jj d||jj|jjd}j|t|jjy#|jjwxYw)Nr>zzAccumulatingProtocol,,r) r8rrfrFrq sessionnostrlogstrrK peerAddressesrrrt) protocolsrhrdrportPathrSrHs rN connectedzOUNIXAdoptStreamConnectionTestsBuilder.test_ServerAddressUNIX..connectedns#, FFD 26r4<<>;N;NO  ''118=(()   ''118=$$++ %nn::1= %%k;?  //1  //1s CC77DN) interface addressFamily)rCgetConnectedClientAndServerr runReactor)rHrrLrs` rNtest_ServerAddressUNIXz.firstServerConnectedsF   1   1  ) )%//*@*@*BGV TrPc@jrj|Srx)runningr)rrLs rNrzOUNIXAdoptStreamConnectionTestsBuilder.getConnectedClientAndServer..stops MrPc8|\}}j||fyrx)r)rrhrddeferredrs rNrzPUNIXAdoptStreamConnectionTestsBuilder.getConnectedClientAndServer..starts!&NFF   vvt4 5rP)r3rprotocolConnectionMadeprotocolConnectionLostr2rrrrrrrrrf)rHrLrr firstServerrhrJr lostDeferredr startDeferredrrrrds ` @@@rNrzAUNIXAdoptStreamConnectionTestsBuilder.getConnectedClientAndServers(&' -5Z * "(0 %(0 % "(0 %(0 %W#.!!$ 4 U **667KL$  * *F,I,I J   T":D!%  * *F,I,I J  6 !!%(DLLN//8rPN) rQrRrSr%r&r'r]rrrrUrPrNrrFs# "8 !D6rPrc6eZdZdZefZdZedZdZ dZ y)UnixClientTestsBuilderz7 Define tests for L{IReactorUNIX.connectUNIX}. NcR|jt||_|jS)z Return a path usable by C{connectUNIX} and C{listenUNIX}. @return: A path instance, built with C{_abstractPath}. )_pathrZrus rNrJzUnixClientTestsBuilder.paths$ :: &t,DJzzrPc:|j|j|S)z Start an UNIX server with the given C{factory}. @param reactor: The reactor to create the UNIX port in. @param factory: The server factory. @return: A UNIX port instance. )rrJrHrLrKs rNrzUnixClientTestsBuilder.listens!!$))W55rPc:|j|j|S)z Start an UNIX client with the given C{factory}. @param reactor: The reactor to create the connection in. @param factory: The client factory. @return: A UNIX connector instance. )rrJrs rNconnectzUnixClientTestsBuilder.connects""499g66rP) rQrRrSrTr'r]rpropertyrJrrrUrPrNrrs2' E  6 7rPr)jrThashlibrosrrrrrpprintr r r r r rstructrtempfilerrtypingrrrunittestrr_AF_UNIX ImportErrorzope.interfacerrtwisted.internetrrtwisted.internet.addressrtwisted.internet.deferrrrtwisted.internet.endpointsrr twisted.internet.errorr!r"r#twisted.internet.interfacesr$r%r&r'twisted.internet.protocolr(r)r*twisted.internet.taskr+&twisted.internet.test.connectionmixinsr,r-r.r/r0#twisted.internet.test.reactormixinsr1twisted.internet.test.test_tcpr2r3r4r5twisted.python.compatr6twisted.python.failurer7twisted.python.filepathr8twisted.python.logr9r:r;twisted.python.reflectr<twisted.python.runtimer=rrrr@rZr\rkr}rrur|rrrrrglobalsupdatemakeTestCaseClassesrrUrPrNrs^ 22;;$++*G1-0@@M  UT-? /*???0+ 0 1)*6K <<")?/?,","J $%;/;&;|S<8LS 6JJLM*7^-C*7Z ';;=>GGsI==JJ