ϪfZdZddlZddlZddlZddlmZ ddlZddlm Z ddl m Z m Z m Z mZddlmZddlmZmZmZmZddlmZdd lmZdd lmZdd lmZmZdd lm Z dd l!m"Z"ddl#m$Z$ddl%m&Z&m'Z'GddZ(Gdde'Z)e*edr#ejVZ,ejZZ.ndxZ,Z.Gdde'Z/Gdde'Z0Gdde'Z1Gdde'Z2Gdde'Z3Gdd ejhZ5Gd!d"Z6Gd#d$Z7Gd%d&ejpZ9Gd'd(e'Z:Gd)d*e'Z;Gd+d,e jxZ=Gd-d.e$e'Z>Gd/d0e'Z?Gd1d2e'Z@y#e$rdZYjwxYw)3zU Tests for L{twisted.application} and its interaction with L{twisted.persisted.sob}. N)StringIO)skipIf)appinternetreactorsservice) backoffPolicy)defer interfacesprotocolreactor) MemoryReactor)sob)twisted_reactors)basicwire)usage) platformType)TwistedModulesMixin)SkipTestTestCaseceZdZdZy)DummyN)__name__ __module__ __qualname__ processName?/usr/lib/python3/dist-packages/twisted/test/test_application.pyrr#sKrrcZeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd Zy) ServiceTestsctj}|jd|j|jdyNhello)rServicesetName assertEqualnameselfss r testNamezServiceTests.testName(s. OO  ' )rctj}tj}|j||j t ||g|j |j |yN)rr& MultiServicesetServiceParentr(listparentr+r,ps r testParentzServiceTests.testParent-sT OO   " 1 a1#& 1%rc4tj}tjd}|j||j t tj ||g|j |jtj |y)N)rr& Applicationr1r(r2IServiceCollectionr3r4s r testApplicationAsParentz$ServiceTests.testApplicationAsParent4sm OO     # 1 g88;rcrtj}tj}|j||j t ||g|j |j ||j|j t |g|j|j yr/) rr&r0r1r(r2r3disownServiceParent assertIsNoner4s r testDisowningzServiceTests.testDisowningTs OO   " 1 a1#& 1%  a"% !((#rctj}|j|j|j |j |j|j |j|jyr/)rr& assertFalserunning startService assertTrue stopServicer*s r testRunningzServiceTests.testRunning^sU OO  #   "  #rctj}tj}|j||j |j |j |j |j |j|j |j|j |j|j |j |j |j yr/) rr&r0r1rLrMrNrOrPr4s r testRunningChildren1z!ServiceTests.testRunningChildren1fs OO   " 1 # #   "  "  # #rc,tjfd}tj}||_||_tj}j ||j ||j|jy)Nc<jjyr/)rOrM)r,r+sr checkRunningz7ServiceTests.testRunningChildren2..checkRunningvs OOAII &r)rr&rPrNr0r1)r+rVtr5r,s` @r testRunningChildren2z!ServiceTests.testRunningChildren2ssm OO  ' OO $ %  " 1 1  rcXtj}|jtj}|j |j |j ||j|j |j|j |j yr/) rr0rNr&rLrMr1rOrH)r+r5r,s r testAddingIntoRunningz"ServiceTests.testAddingIntoRunningst  "  OO  # 1  "  #rc0tjfd}|_tj}tj}j ||j ||j|j j y)Ncd_yN)privilegedStarted)r,sr pssz(ServiceTests.testPrivileged..psss "#A r)rr&privilegedStartServicer0r1rOr_)r+r`s1r5r,s @r testPrivilegedzServiceTests.testPrivilegedsr OO  $$' __   " 1 A   " ++,rctj}|jtj|}|j |j |j |j yr/)rr&rNcopyrLrMrO)r+r,rbs r testCopyingzServiceTests.testCopyingsG OO   YYq\ $  "rN)rrrr-r6r;r>rDrFrJrQrSrXrZrcrfrrr r"r"'sD* &B8;?$$ $ $ -#rr"getuidceZdZdZdZdZy) ProcessTestsctjdd}|j|jd|j|jdy)N)rProcessr(uidgidr+r5s r testIDzProcessTests.testIDs: OOAq ! " "rctjd}|j|jd|j |j tjd}|j |j|j|j dtj}|j |j|j |j y)Nrk)ro)rrmr(rnrIrorps r testDefaultszProcessTests.testDefaultss OOA  " !%% OO " !%%  " OO  !%%  !%% rctj}|j|jd|_|j |jdyr$)rrmrIrr(rps r testProcessNamezProcessTests.testProcessNames; OO  !--(  0rN)rrrrqrsrurrr riris# !1rriceZdZdZdZdZy)InterfacesTestsc|jtjjtjyr/)rOrIService providedByr&r+s r testServicezInterfacesTests.testService& ((33GOO4EFGrc|jtjjtj|jtj jtjyr/)rOrryrzr0r:r{s r testMultiServicez InterfacesTests.testMultiServicesN ((33G4H4H4JKL 22==g>R>R>TUVrc|jtjjtjyr/)rOrIProcessrzrmr{s r testProcesszInterfacesTests.testProcessr}rN)rrrr|rrrrr rwrwsHWHrrwc$eZdZdZdZdZdZy)ApplicationTestsctjdtjddtjdddyNr%rkrl)rr9r{s r testConstructorz ApplicationTests.testConstructors2G$GQ'GQ*rctjd}|jtj|j|jtj|j tjdd}|j tj|jd|jtj|j tjddd}|j tj|jd|j tj|j dyr)rr9rIrrnror(r+as r testProcessComponentz%ApplicationTests.testProcessComponents    ( '**1-112 '**1-112    + ))!,00!4 '**1-112   A . ))!,00!4 ))!,00!4rcXtjd}|jtj|tj||j tj|j d|jtj|jyr$) rr9assertIsryr:r(r)rIr3rs r testServiceComponentz%ApplicationTests.testServiceComponentsv    ( g&&q)7+E+Ea+HI ))!,117; '**1-445rctjd}tj|}|j |j d|j |j d|j|j|y)Nr%pickle) rr9r IPersistabler(styler)roriginal)r+rr5s r testPersistableComponentz)ApplicationTests.testPersistableComponents\    (   Q  (+ ) ajj!$rN)rrrrrrrrrr rrs+ 56 %rrceZdZdZy) LoadingTestscLtjd}tj|}dj D]n}|j ||j tjd|dz|}|jtj|jdptdd5}|jddgdddtjdd }|jtj|jdy#1swYOxYw) Nr% source picklezhello.tarz hello.tacw(from twisted.application import service +application = service.Application('hello') python) rr9rrsplitsetStylesaveloadApplicationr(ryr)open writelines)r+rr5ra1fs r test_simpleStoreAndLoadz$LoadingTests.test_simpleStoreAndLoads    (   Q $**, AE JJu  FFH((eAh)>FB   W--b166 @  A +s # q LL?B   $ $[( ; ))"-22G<  s 8DD#N)rrrrrrr rrs=rrc$eZdZdZdZdZdZy)AppSupportTestscL|jtjdy)Nr)rIr getPassphraser{s r testPassphrasezAppSupportTests.testPassphrases #++A./rctjd}dddd}djD]}|j}d|ddij ||<t j |j|t j |jdtj|d}|jtj|jd|j}d|d <tdd 5}|jd d gdddtj|d}|jtj|jdy#1swYOxYw) zL Test loading an application file in different dump format. r%N)filesourcerrhelloapplicationrrfilenamerrrr)rr9rregetrrrrrgetApplicationr(ryr)rr)r+r baseconfigrconfigrrs r testLoadApplicationz#AppSupportTests.testLoadApplicationsQ    ("ddC $**, AE__&F;MFHf%))%7 8   Q  ( ( /   Q  $ $.@ $ A##FD1B   W--b166 @  A"-x $c * a LL?B     - ))"-22G<  s E))E2c tjd}djD]}djD]}tj|j |tj|j dtjd|dd|dtjd|}|jtj|jdy)Nr@r converttestrzconverttest.outr) rr9rrrrrr convertStylerr(ryr))r+applinstyleoutstyleappl2s r test_convertStylez!AppSupportTests.test_convertStyles""6*&,,. GG+113 G  &//8  &++]+C  !7D2CXq //0A8L  !1!1%!8!=!=vF G Grctjd}tj|d|j tj |j y)Nr@r)rr9rstartApplicationrOryrM)r+rs r test_startApplicationz%AppSupportTests.test_startApplication)s?""6* T1% ((.667rN)rrrrrrrrrr rrs0=2 G8rrceZdZdZdZdZy)Fooc:|jjdy)Nslalala ) transportwriter{s r connectionMadezFoo.connectionMade0s ]+rcZ||j_|jjyr/)factorylinerloseConnection)r+rs r lineReceivedzFoo.lineReceived3s   %%'rcv|jjj|jjyr/)rdcallbackrr+reasons r connectionLostzFoo.connectionLost7s"  1 12rN)rrrrrrrrr rr/s,(3rrceZdZdZdZdZy)DummyAppNc6||j|j<yr/servicesr)r+rs r addServicezDummyApp.addService>s&- gll#rc2|j|j=yr/rrs r removeServicezDummyApp.removeServiceAs MM',, 'r)rrrrrrrrr rr;sK.(rrceZdZdZdZy) TimerTargetcg|_yr/)lr{s r __init__zTimerTarget.__init__Fs rc:|jj|yr/)rappend)r+whats r rzTimerTarget.appendIs  drN)rrrrrrrr rrEs rrceZdZdZy)TestEchoc:|jjdyNT)rrrs r rzTestEcho.connectionLostNs rN)rrrrrrr rrMsrrc eZdZdZdZdZdZeeje d ddZ dZ eeje d dd Z eeje d dd Zd Zd Zd ZdZdZdZdZdZy) InternetTestsctjjtj}t |_t jt _tjd|}|j|jjj}tj}t j|_t |_d|_tj$d||j|jj'|j(d|jj'fd|jj'd|jS)Nr 127.0.0.1lalalac$jSr/rPxr,s r z'InternetTests.testTCP..b  rc"tjSr/rrrs r rz'InternetTests.testTCP..c  r)rr0rNr ServerFactoryrr Deferredrr TCPServerr1_portgetHostport ClientFactoryrr TCPClient addCallbackr()r+rrWnumr,s @r testTCPzInternetTests.testTCPSs  " ((*#^^%   q' * 1ggoo$$((*NN$  ;W5FFqI d.. : 78 23yyrctjtds tdt j t jd}|j|jjj|jdfd}tj|jj!|S)z Test L{internet.UDPServer} with a random port: starting the service should give it valid port, and stopService should free it so that we can start a server on the same port again. Nz)This reactor does not support UDP socketsrcptj}|j|jSr/)r UDPServerrNrP)ignoredrWrr5s r onStopz&InternetTests.test_UDP..onStopts+""3*A NN ==? "r)r IReactorUDPr rr DatagramProtocolrrrNrrrassertNotEqualr maybeDeferredrPr)r+rWrrr5s @@r test_UDPzInternetTests.test_UDPfs %%gt4FG G  % % '   q! $ ggoo$$ C# # ""1==1==fEErctj}t|_tjt_t jd|d_jjjj}tj}tj|_t|_d|_t j d||j#|j j%|j&d|j j%fd|j j%fd|j j%d|j S)Nrr^rrc$jSr/r)rcs r rz.InternetTests.testPrivileged..rrc$jSr/rrrWs r rz.InternetTests.testPrivileged..rrc"tjSr/rrs r rz.InternetTests.testPrivileged..rr)r rrr rrrr privilegedrarrrrrrrrNrr()r+rrr rWs @@r rczInternetTests.testPrivileged{s((*#^^%   q' *    "ggoo$$((*NN$    {C 9  d.. : 78 78 23yyrctj}tj|_t j d|}|j |jjj}|jtjtj}fd|_t jd||}|j S)Nrc&jdSr/rargsrs r rz.qzz$7Grr)r rrEchorrrNrrrrPr rrclientConnectionFailedr)r+rrWrr rs @r testConnectionGettingRefusedz*InternetTests.testConnectionGettingRefuseds((*99   q' * ggoo$$  NN ((*)G&   {C 9 rNz1This reactor does not support UNIX domain socketsctjjtj}t |_t jt _tjd|}|jtj}t|_t j|_d|_tjd|j|jj!|j"d|jj!fd|jj!d|jj!|j$||jS)Necho.sktrc$jSr/rrs r rz(InternetTests.testUNIX..rrc"tjSr/rrs r rz(InternetTests.testUNIX..rr)rr0rNr rrr rrr UNIXServerr1rrr UNIXClientrr( _cbTestUnix)r+rrWr,s @r testUNIXzInternetTests.testUNIXs   " ((*#^^%    G 4 1((*NN$  J0AA!D d.. : 78 23 d..;yyrcvtjt_d|_tj|_j |jj |jd|jj fd|jj d|jS)Nrc$jSr/rrs r rz+InternetTests._cbTestUnix..rrc"tjSr/rrs r rz+InternetTests._cbTestUnix..rr)r rrrrrNrr()r+rrr,s `r r!zInternetTests._cbTestUnixsz^^%  NN$   d.. : 78 23yyrctj}tj|_t j d|}|j |j|jdtj|}|j|j|j|j|j|j|jtj}tj|_t jd|}|j |j|j dtj|}|j|j |j|j|j |j|jy)Nr)r rrrrrrNfailIfIdenticalrrerIrPrLrMrr  _connection)r+rrWt1s r testVolatilezInternetTests.testVolatiles0 ((*99    G 4  QWWd+ YYq\ "((#  !''" #((*99    G 4  Q]]D1 YYq\ "..)  !--( #rctj}tj|_t j d|}|j |j|j|jtj}tjfd|_ tjd|S)Nrc&jdSr/rrs r rz2InternetTests.testStoppingServer..rr)r rrrrrrNrPrLrMrr rrr connectUNIX)r+rrWrs @r testStoppingServerz InternetTests.testStoppingServers ((*99    G 4   #((* NN )G&J0rc$t}tjd|jd}|j t j |}|jt j|}|j|jy)Nr^r%) rr TimerServicerrNrdumpsrPloadsrLrM)r+targett0r,rWs r testPickledTimerzInternetTests.testPickledTimersb  " "1fmmW =  LL   LLO #rctjtjddjfd}|_j j fdj fdS)Nr^c ddzS)Nr^rrrrr rz/InternetTests.testBrokenTimer..s Q!Vrc8|jdyr/r)whyr oldFaileds r _failedz.InternetTests.testBrokenTimer.._faileds cN JJt rcjSr/rrs r rz/InternetTests.testBrokenTimer..s  rcjtgjtDcgc]}|jjc}Scc}wr/)r(ZeroDivisionErrorflushLoggedErrorsvalue __class__)ror+s r rz/InternetTests.testBrokenTimer..s?d&&"#,0,B,BCT,UVq""VVsA )r rrr0r;rNr)r+r;rr:rWs` @@@r testBrokenTimerzInternetTests.testBrokenTimersg NN   ! !!^ 4II     -.   rc 0gd}|ddD]2}ttd|ztdr"|j|4|D]}dD]}|dk(r|dk(r|dk(r|dk(r|j t t ||ztt ||zj}dd d|}|j t t||zxs |d k(xr|dk(tt ||z}|jtj||y) z L{twisted.application.internet} dynamically defines a set of L{service.Service} subclasses that in general have corresponding reactor.listenXXX or reactor.connectXXX calls. )TCPUNIXSSLUDP UNIXDatagram MulticastNIReactor)ServerClientrJrMrHlistenconnect) getattrr r removerOhasattrrmethodr(rry)r+transtransiderSprefixrBs r test_everythingTherez"InternetTests.test_everythingThere s# K!H #D97:zD'89'4H T" # 9D, 9;&48+;5=TX%5$+ >? 4$;7>>$, B4HGVf_5A)+?%3GHdTk24  !1!1!!4a8 9 9rcttjD]%}|jtt||d'y)z L{twisted.application.internet} dynamically defines L{service.Service} subclasses. This test ensures that the subclasses exposed by C{__all__} are valid attributes of the module. z1 not importable from twisted.application.internetN)r__all__rOrR)r+clss r test_importAllzInternetTests.test_importAll$s: ## C OO#&%HI  rct}t}tjd||}|j |j |j jddd|fy)z L{internet._AbstractServer} supports a C{reactor} keyword argument that can be used to parametrize the reactor used to listen for connections. r N)robjectrrrNr( tcpServerspopr+r rrWs r #test_reactorParametrizationInServerz1InternetTests.test_reactorParametrizationInServer0sZ  /(   tWg >  ++//1"15gGrct}tj}tjdd||}|j |j |jjdddd|fy)z L{internet._AbstractClient} supports a C{reactor} keyword arguments that can be used to parametrize the reactor used to create new client connections. rr^r_N) rr rrrrNr( tcpClientsrcrds r #test_reactorParametrizationInClientz1InternetTests.test_reactorParametrizationInClient=sf  /((*   {D'7 K  ++//1"15 T77STrct}tj}tjd||}|j |j |jjddd|f|j|j |j |jjddd|fy)z Like L{test_reactorParametrizationInServer}, but stop and restart the service and check that the given reactor is still used. r^r_Nr`) rr FactoryrrrNr(rbrcrPrds r 0test_reactorParametrizationInServerMultipleStartz>InternetTests.test_reactorParametrizationInServerMultipleStartJs  /""$   tWg >  ++//1"15gG   ++//1"15gGrct}tj}tjdd||}|j |j |jjdddd|f|j|j |j |jjdddd|fy)z Like L{test_reactorParametrizationInClient}, but stop and restart the service and check that the given reactor is still used. rr^r_Nrg) rr rrrrNr(rhrcrPrds r 0test_reactorParametrizationInClientMultipleStartz>InternetTests.test_reactorParametrizationInClientMultipleStartYs  /((*   {D'7 K  ++//1"15 T77ST   ++//1"15 T77STr)rrrrr rcrrr IReactorUNIXr r"r!r*r.r5rCrXr\rerirlrnrrr rrRs&F*(  #J # #GT 22; * #J # #GT 22;$ $. #J # #GT 22;   $(94  H U H Urrc$eZdZdZdZdZdZy)TimerBasicTestsc8tj}tjd|jd_j j |jjd|jfd|jfd|S)Nr^r%c8jjSr/rWrPrr+s r rz/TimerBasicTests.testTimerRuns..o 2 2 4rcNjjjSr/)rLrWrMrus r rz/TimerBasicTests.testTimerRuns..ps 0 0 @r) r rrr0rrWrNrr()r+rs` r testTimerRunszTimerBasicTests.testTimerRunsjsl NN &&q!**g>  d&&0 45 @Arc6|jjSr/rtr{s r tearDownzTimerBasicTests.tearDownssvv!!##rcftj}tjdf|dfgfd}tjd|_jj fd}fd}fd}|j ||j ||j ||S)NbarfoocNj\}}|j|yr/)rcr)rargworks r triggerz1TimerBasicTests.testTimerRestart..trigger|sXXZFAs JJsOrr^c\j|djjS)Nr}r(rWrPresultr+s r onFirstResultz7TimerBasicTests.testTimerRestart..onFirstResults&   VU +66%%' 'rcjjjjjSr/)rLrWrMrN)rd2r+s r onFirstStopz5TimerBasicTests.testTimerRestart..onFirstStops.   TVV^^ , FF   !Irc^j|djjy)Nr|rrs r onSecondResultz8TimerBasicTests.testTimerRestart..onSecondResults#   VU + FF   r)r rrr0rWrNr)r+d1rrrrrrs` @@r testTimerRestartz TimerBasicTests.testTimerRestartvs ^^  ^^ U b%[) &&q'2  (   ! }% {# ~& rcgfd}tj}tjd|dd|_jj |j jdgdz|j fd|S)Nchj|t|k(r|jyyr/)rlenr)datanumberrrs r rz/TimerBasicTests.testTimerLoops..triggers* HHTN1v 1  rg{Gz?r% c8jjSr/rtrus r rz0TimerBasicTests.testTimerLoops..rvr)r rrr0rWrNrr()r+rrrs` @r testTimerLoopszTimerBasicTests.testTimerLoopssq   NN &&tWgr1E  d&& B7 45rN)rrrrxrzrrrrr rqrqis$> rrqceZdZdZdZy) FakeReactorz6 A fake reactor with a hooked install method. cXtjj|g|i|||_y)zv @param install: any callable that will be used as install method. @type install: C{callable} N)rReactorrinstall)r+rrkwargss r rzFakeReactor.__init__s) !!$888 rN)rrr__doc__rrrr rrs rrc`eZdZdZdZdZddZdZdZdZ d Z d Z d Z d Z d ZdZdZy)PluggableReactorTestsz: Tests for the reactor discovery/inspection APIs. ctg|_g|_tj|_|j t_y)aI Override the L{reactors.getPlugins} function, normally bound to L{twisted.plugin.getPlugins}, in order to control which L{IReactorInstaller} plugins are seen as available. C{self.pluginResults} can be customized and will be used as the result of calls to C{reactors.getPlugins}. N) pluginCalls pluginResultsr getPluginsoriginalFunction _getPluginsr{s r setUpzPluggableReactorTests.setUps0 ( 3 3"..rc.|jt_y)z> Restore the original L{reactors.getPlugins}. N)rrrr{s r rzzPluggableReactorTests.tearDowns#33rNcf|jj||ft|jS)zy Stand-in for the real getPlugins method which records its arguments and returns a fixed result. )rrr2r)r+ interfacepackages r rz!PluggableReactorTests._getPluginss. G 45D&&''rcdd}tdz}d}tj|||g|_tj}|j |j tjdfg|D]/}|j|k(s|j |j|y|jdy)zP Test that reactor plugins are returned from L{getReactorTypes} fakereactortestz .fakereactor descriptionNz6Reactor plugin not present in getReactorTypes() result) rrrrgetReactorTypesr(rIReactorInstaller shortNamerfail)r+r)rr reactorTypesrs r test_getPluginReactorTypesz0PluggableReactorTests.test_getPluginReactorTypess!^+# &..tWkJK//1  ))X-G-G,N+OP PA{{d"   < P IIN Orcgfd}t|dtd}d|i}|j|tjddd}|j |j dgy)zy Test that L{reactors.Reactor.install} loads the correct module and calls its install attribute. c(jdyrr installedsr rz?PluggableReactorTests.test_reactorInstallation..install   T "rr described fakereactorTN)rrreplaceSysModulesrrrr()r+r fakeReactormodules installerrs @r test_reactorInstallationz.PluggableReactorTests.test_reactorInstallationsm   #"'+.installrrrrTNrrrrinstallReactorr()r+rr)rrrs @r test_installReactorz)PluggableReactorTests.test_installReactorsV   #!# )'4+NO% TF+rctfd}d}t}d}t||||g_t j |}j |y)zt Test that the L{reactors.installReactor} function correctly returns the installed reactor. c8ddlm}j|dy)Nr)rr )twistedrpatch)rr r+s r rzHPluggableReactorTests.test_installReactorReturnsReactor..installs ( JJxG 4rrrN)rarrrrrr)r+rr)rrrr s` @r !test_installReactorReturnsReactorz7PluggableReactorTests.test_installReactorReturnsReactor sV ( 5 !# )'4+NO++D1  i)rcgfd}d}t}d}t||||}tdd||}||g|_tj||j dgy)z Test that the L{reactors.installReactor} function correctly installs the specified reactor when there are multiple reactor plugins. c(jdyrrrsr rzIPluggableReactorTests.test_installReactorMultiplePlugins..install#rrrrcyr/rrrr rzJPluggableReactorTests.test_installReactorMultiplePlugins..*r otherreactorTNr)r+rr)rrr otherReactorrs @r "test_installReactorMultiplePluginsz8PluggableReactorTests.test_installReactorMultiplePluginssm   #!# !'4+F "<+V *K8% TF+rcpg|_|jtjtjdy)z Test that L{reactors.installReactor} raises L{reactors.NoSuchReactor} when asked to install a reactor which it cannot find. somereactorN)rrBr NoSuchReactorrr{s r test_installNonExistentReactorz4PluggableReactorTests.test_installNonExistentReactor/s-     " "H$;$;] rcd}d}t}d}t||||g|_|jtt j |y)z Test that L{reactors.installReactor} raises an exception when asked to install a reactor which doesn't work in this environment. ctd)NMissing foo bar ImportErrorrrr rzFPluggableReactorTests.test_installNotAvailableReactor..install?s/0 0rrrN)rrrrBrrr)r+rr)rrs r test_installNotAvailableReactorz5PluggableReactorTests.test_installNotAvailableReactor9sF  1!# )'4+NO +x'>'>ErcrgddGfddtjtj}fd}t |dt dg|_|}|jgd|jd |jjd |j|d dy ) zx Test that the reactor selected is installed as soon as possible, ie when the option is parsed. zreactor installedzsubcommands loadedc$eZdZefdZy)QPluggableReactorTests.test_reactorSelectionMixin..ReactorSelectionOptionsc<jddfddfgS)N subcommandcSr/rr{sr rzoPluggableReactorTests.test_reactorSelectionMixin..ReactorSelectionOptions.subCommands..UsTrztest subcommandr)r+SUBCOMMAND_EVENTexecuteds`r subCommandsz]PluggableReactorTests.test_reactorSelectionMixin..ReactorSelectionOptions.subCommandsRs# 01%t\;LMNNrN)rrrpropertyr)rrsr ReactorSelectionOptionsrQs  O Orrc(jyr/r) INSTALL_EVENTrsr rzAPluggableReactorTests.test_reactorSelectionMixin..installWs OOM *rrrz --reactorrrrr^r N) rOptionsrReactorSelectionMixinrrr parseOptionsr(count)r+rroptionsrrrs @@@r test_reactorSelectionMixinz0PluggableReactorTests.test_reactorSelectionMixinHs + / OemmS5N5N O  + !2Hk J *+KL !m4  6: +->?rcdGddtjtj}g|_|}t |_|jtj|jgd}|jd|jd|jd|jdy)z Test that the usage mixin exits when trying to use a non existent reactor (the name not matching to any reactor), giving an error message. c eZdZy)\PluggableReactorTests.test_reactorSelectionMixinNonExistent..ReactorSelectionOptionsNrrrrrr rrk rrrrr help-reactorsN) rrrrrr messageOutputrB UsageErrorrassertInr)r+rres r %test_reactorSelectionMixinNonExistentz;PluggableReactorTests.test_reactorSelectionMixinNonExistentds emmS5N5N  )+ (         :  '3 oqvvay1rcGddtjtj}dfd}d}t}d}t ||||g|_|}t|_|jtj|jgd}|j|jd|jd |jdy ) z Test that the usage mixin exits when trying to use a reactor not available (the reactor raises an error at installation), giving an error message. c eZdZy)]PluggableReactorTests.test_reactorSelectionMixinNotAvailable..ReactorSelectionOptionsNrrrr rrrrrrctr/r)messagesr rzMPluggableReactorTests.test_reactorSelectionMixinNotAvailable..installsg& &rrrrrrN)rrrrrrrrrrBrrrr) r+rrr)rrrrrs @r &test_reactorSelectionMixinNotAvailablez>> Mrzasyncio library not availablec|jtjj|j|j dtjj z|jy)zU --help-reactors should display the asyncio reactor on Python >= 3.4 rN)rrr rr assertNotInrr{s r test_hasAsyncIOz!HelpReactorsTests.test_hasAsyncIOsI &..::DLLI /77AAA4<<Prwin32zTest only applicable on Windowsc|jtjj|j|j dtjj z|jy)zL --help-reactors should display the iocp reactor on Windows rN)rriocprrr rr{s r test_iocpWin32z HelpReactorsTests.test_iocpWin32sI &++77F /44>>> MrzTest not applicable on Windowsc|jtjj|j|jdtjj z|jy)zP --help-reactors should NOT display the iocp reactor on Windows rN)rrrrrrr{s r test_iocpNotWin32z#HelpReactorsTests.test_iocpNotWin32sG &++77F c,11;;;T\\Jrcd}tj}||_t|_|j t |j|jj}|jd|y)z> --help-reactors with only supported reactors c30Ktjywr/)rdefaultrrr rzEHelpReactorsTests.test_onlySupportedReactors..getReactorTypess"** *szreactors not availableN) rr_getReactorTypesrrrBrrrr )r+rrrs r test_onlySupportedReactorsz,HelpReactorsTests.test_onlySupportedReactorssd  +++-#2 (  *g&?&?@''002 17;rN) rrrrrrr r r rrrrrrr rrs= G;<N=N K89Q:Q LG #%FGNHN LG #%EFKGK .rrjitterrr`r^g@rg UM@=dN)r assertAlmostEqualr(r+pols r test_calculates_correct_valuesz1BackoffPolicyTests.test_calculates_correct_valuessxCs9= s1vq) s1vs+ s2w 6 R"% S2&rctdddd}|j|dd|j|ddy ) z L{backoffPolicy()} does not fail for large values of the attempt parameter. In previous versions, this test failed when attempt was larger than 1750. See https://twistedmatrix.com/trac/ticket/9476 rrrcyr]rrrr rzLBackoffPolicyTests.test_does_not_overflow_on_high_attempts..rrr r#i@BNr r(r&s r 'test_does_not_overflow_on_high_attemptsz:BackoffPolicyTests.test_does_not_overflow_on_high_attemptss<Cs9= TB' Wr*rcTtdddd}|j|ddy) z Even with unusual parameters, any L{OverflowError} within L{backoffPolicy()} will be caught and L{maxDelay} will be returned instead rrg _Bcyr]rrrr rzSBackoffPolicyTests.test_does_not_overflow_with_large_factor_value..rrr r+r#Nr,r&s r .test_does_not_overflow_with_large_factor_valuezABackoffPolicyTests.test_does_not_overflow_with_large_factor_values( CtI> TB'rN)rrrrr(r-r0rrr rrs ' +(rr)Arreosriorr runittestrtwisted.applicationrrrrtwisted.application.internetr twisted.internetr r r r twisted.internet.testingrtwisted.persistedrtwisted.pluginsrtwisted.protocolsrrtwisted.pythonrtwisted.python.runtimer#twisted.python.test.modules_helpersrtwisted.trial.unittestrrrr"rRrgcuruidgetgidcurgidrirwrrr LineReceiverrrrrrrrqrrrrrrrr rCs|  @@6AA2!,) /C5x#8x#v 2x RYY[F RYY[FFV1810 Hh H%x%>=8=(,8h,8^ 3%   3((tyy TUHTUn9h9x ("" c2/c2L;<;<|#(#(MGsE::FF