a 8êdgVPã@sÂdZddlZddlZddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZz ddlZWneyždZYn0d d „ZGd d „d ejƒZGd d„dejƒZGdd„dƒZGdd„deƒZGdd„deƒZGdd„deeƒZejdkrBGdd„deejƒZGdd„deejƒZn|ddlZe edƒrjGdd„deejƒZ!e edƒrŠGd d!„d!eejƒZ"e ed"ƒrªGd#d$„d$eejƒZ#Gd%d„deejƒZdS)&z!Tests for sendfile functionality.éN)Ú base_events)Ú constants)Úmock)Úsupport)Ú socket_helper)ÚutilscCst d¡dS©N)ÚasyncioZset_event_loop_policy©r r ú;/usr/local/lib/python3.9/test/test_asyncio/test_sendfile.pyÚtearDownModulesr cs>eZdZd dd„Zdd„Zdd„Zd d „Z‡fd d „Z‡ZS)ÚMySendfileProtoNrcCs@d|_d|_d|_|dur.| ¡|_| ¡|_tƒ|_||_dS)NZINITIALr) Ú transportÚstateÚnbytesÚ create_futureÚ connectedÚdoneÚ bytearrayÚdataÚ close_after)ÚselfÚlooprr r r Ú__init__s  zMySendfileProto.__init__cCs"||_d|_|jr|j d¡dS)NZ CONNECTED)rrrÚ set_result©rrr r r Úconnection_made&szMySendfileProto.connection_madecCs d|_dS)NZEOF)r©rr r r Ú eof_received-szMySendfileProto.eof_receivedcCsd|_|jr|j d¡dS)NZCLOSED)rrr©rÚexcr r r Úconnection_lost1szMySendfileProto.connection_lostcsJ|jt|ƒ7_|j |¡tƒ |¡|jrF|j|jkrF|j ¡dSr) rÚlenrÚextendÚsuperÚ data_receivedrrÚclose©rr©Ú __class__r r r%7s   zMySendfileProto.data_received)Nr) Ú__name__Ú __module__Ú __qualname__rrrr!r%Ú __classcell__r r r(r r s  r c@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) ÚMyProtocCs(d|_d|_tƒ|_| ¡|_d|_dS©NF)ÚstartedÚclosedrrrÚfutr)rrr r r rBs  zMyProto.__init__cCsd|_||_dS©NT)r0rrr r r rIszMyProto.connection_madecCs|j |¡dSr)rr#r'r r r r%MszMyProto.data_receivedcCsd|_|j d¡dSr3)r1r2rrr r r r!PszMyProto.connection_lostcÃs|jIdHdSr)r2rr r r Ú wait_closedTszMyProto.wait_closedN)r*r+r,rrr%r!r4r r r r r.@s r.csdeZdZddZdZdd„Ze‡fdd„ƒZe‡fdd „ƒZ‡fd d „Z ‡fd d „Z dd„Z ‡Z S)Ú SendfileBasesSendfileBaseDatai écCst‚dSr)ÚNotImplementedErrorrr r r Úcreate_event_loop`szSendfileBase.create_event_loopcsFttjdƒ}| |j¡Wdƒn1s.0Ytƒ ¡dS)NÚwb)ÚopenrÚTESTFNÚwriteÚDATAr$Ú setUpClass)ÚclsÚfpr(r r r>cs*zSendfileBase.setUpClasscst tj¡tƒ ¡dSr)rÚunlinkr;r$Ú tearDownClass©r?r(r r rBis zSendfileBase.tearDownClasscs@ttjdƒ|_| |jj¡| ¡|_| |j¡t ƒ  ¡dS)NÚrb) r:rr;ÚfileÚ addCleanupr&r8rZset_event_loopr$ÚsetUprr(r r rGns   zSendfileBase.setUpcs4|j ¡st |j¡| ¡t ¡tƒ ¡dSr) rZ is_closedÚ test_utilsZ run_brieflyZ doCleanupsrÚ gc_collectr$ÚtearDownrr(r r rJus   zSendfileBase.tearDowncCs |j |¡Sr)rÚrun_until_complete)rÚcoror r r Úrun_loop~szSendfileBase.run_loop) r*r+r,r=ÚBUF_SIZEr8Ú classmethodr>rBrGrJrMr-r r r(r r5Xs  r5csteZdZe‡fdd„ƒZe‡fdd„ƒZddd„Zdd „Zdd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z ‡ZS)ÚSockSendfileMixincstj|_dt_tƒ ¡dS)Ni@)rÚ!SENDFILE_FALLBACK_READBUFFER_SIZEÚ_SockSendfileMixin__old_bufsizer$r>rCr(r r r>„szSockSendfileMixin.setUpClasscs|jt_tƒ ¡dSr)rRrrQr$rBrCr(r r rBŠszSockSendfileMixin.tearDownClassTcCs.t tjtj¡}| d¡|r*| |j¡|Sr/)ÚsocketÚAF_INETÚ SOCK_STREAMÚ setblockingrFr&)rÚcleanupÚsockr r r Ú make_sockets   zSockSendfileMixin.make_socketcCs| tjtj|j¡dSr)Ú setsockoptrSÚ SOL_SOCKETÚ SO_RCVBUFrN)rrXr r r Úreduce_receive_buffer_size–sz,SockSendfileMixin.reduce_receive_buffer_sizeNcCs.| tjtj|j¡|dur*|j|jddS)N)Úhigh)rZrSr[Ú SO_SNDBUFrNZset_write_buffer_limits)rrXrr r r Úreduce_send_buffer_size›sz)SockSendfileMixin.reduce_send_buffer_sizecs¢tˆjƒ‰t ¡}ˆjdd}| tj|f¡ˆ ˆjj‡fdd„|d¡‰ˆ  |¡ˆ ¡}ˆ ˆj  |d|f¡¡ˆ  |¡‡‡‡fdd„}ˆ  |¡|ˆfS) NF)rWcsˆSrr r )Úprotor r Ú«óz8SockSendfileMixin.prepare_socksendfile..)rXz 127.0.0.1cs<ˆjdur"ˆj ¡ˆ ˆ ¡¡ˆ ¡ˆ ˆ ¡¡dSr)rr&rMr4r ©rarÚserverr r rW²s   z7SockSendfileMixin.prepare_socksendfile..cleanup) r.rrÚfind_unused_portrYÚbindÚHOSTrMÚ create_serverr]Z sock_connectr`rF)rÚportÚsrv_sockrXrWr rdr Úprepare_socksendfile¥s    ÿ   z&SockSendfileMixin.prepare_socksendfilecCsv| ¡\}}| |j ||j¡¡}| ¡| | ¡¡| |t|j ƒ¡| |j |j ¡| |j  ¡t|j ƒ¡dSr) rlrMrÚ sock_sendfilerEr&r4Ú assertEqualr"r=rÚtell©rrXraÚretr r r Útest_sock_sendfile_successÀs z,SockSendfileMixin.test_sock_sendfile_successcCsv| ¡\}}| |j ||jdd¡¡}| ¡| | ¡¡| |j|j dd…¡| |j  ¡d¡| |d¡dS)NéèiÐi¸ ) rlrMrrmrEr&r4rnrr=rorpr r r Ú(test_sock_sendfile_with_offset_and_countÊs ÿz:SockSendfileMixin.test_sock_sendfile_with_offset_and_countc Cs„| ¡\}}t ¡(}| |j ||dd¡¡}Wdƒn1sB0Y| ¡| | ¡¡| |d¡| |j   ¡d¡dS)Nr) rlÚtempfileÚ TemporaryFilerMrrmr&r4rnrEro)rrXraÚfrqr r r Útest_sock_sendfile_zero_sizeÕs  ÿ$ z.SockSendfileMixin.test_sock_sendfile_zero_sizecCs²dd}| ¡\}}| |j ||¡¡| |j ||j¡¡}| |j ||¡¡| ¡| | ¡¡| |t |j ƒ¡||j |}| |j |¡| |j  ¡t |j ƒ¡dS)Nsmix_regular_sendr6) rlrMrZ sock_sendallrmrEr&r4rnr"r=rro)rÚbufrXrarqZexpectedr r r Ú(test_sock_sendfile_mix_with_regular_sendàs z:SockSendfileMixin.test_sock_sendfile_mix_with_regular_send)T)N)r*r+r,rOr>rBrYr]r`rlrrrtrxrzr-r r r(r rP‚s     rPc@sÖeZdZdddœdd„Ze ejdkd¡dd „ƒZd d „Z d d „Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Ze ej d ¡d!¡d"d#„ƒZd$d%„Ze eed&ƒ d'¡d(d)„ƒZd*d+„Zd,S)-Ú SendfileMixinFr©Úis_sslrc s t ¡}tˆj|d‰|r:ts(ˆ d¡t ¡}t ¡}nd}d}t   t j t j ¡}|  tj |f¡ˆ ˆjj‡fdd„||d¡‰ˆ |¡|r˜tj }nd}t   t j t j ¡}| tj |f¡tˆjd‰ˆ ˆjj‡fdd„|||d¡\} } ˆj|| d ‡‡‡‡fd d „} ˆ | ¡ˆˆfS) N)rrz No ssl modulecsˆSrr r )Ú srv_protor r rbrcz0SendfileMixin.prepare_sendfile..)rXÚssl)rcsˆSrr r )Ú cli_protor r rbrc)rXrÚserver_hostname)rcsFˆj ¡ˆj ¡ˆ ˆj¡ˆ ˆj¡ˆ ¡ˆ ˆ ¡¡dSr)rr&rMrr4r ©r€rrer~r r rWs     z/SendfileMixin.prepare_sendfile..cleanup)rrfr rrÚskipTestrHZsimple_server_sslcontextZsimple_client_sslcontextrSrTrUrgrhrMrir]ÚconnectÚcreate_connectionr`rF) rr}rrjZsrv_ctxZcli_ctxrkrZcli_sockÚtrÚprrWr r‚r Úprepare_sendfileós>ÿ   ÿ    þ  zSendfileMixin.prepare_sendfileÚwin32zUDP sockets are not supportedcCsŽ| |jjtjtjd¡\}}z`| td¡&| |j  ||j ¡¡Wdƒn1sX0Y|  d|j   ¡¡W|  ¡n |  ¡0dS)N)Úfamilyú not supportedr)rMrZcreate_datagram_endpointr ZDatagramProtocolrSrTÚassertRaisesRegexÚ RuntimeErrorÚsendfilerErnror&)rr†r‡r r r Útest_sendfile_not_supportedsþÿÿ"z)SendfileMixin.test_sendfile_not_supportedcCsŒ| ¡\}}| |j |j|j¡¡}|j ¡| |j¡| |t |j ƒ¡| |j t |j ƒ¡| |j |j ¡| |j  ¡t |j ƒ¡dSr©rˆrMrrŽrrEr&rrnr"r=rrro©rr~r€rqr r r Ú test_sendfile-s ÿ  zSendfileMixin.test_sendfilecs ˆ ¡\}}‡fdd„}|ˆj_ˆ ˆj |jˆj¡¡}|j ¡ˆ |j¡ˆ  |t ˆj ƒ¡ˆ  |j t ˆj ƒ¡ˆ  |j ˆj ¡ˆ  ˆj ¡t ˆj ƒ¡dS)Ncstj ˆj||||¡Sr©rZ BaseEventLoopÚ_sendfile_nativer©ZtransprEÚoffsetÚcountrr r Úsendfile_native;s ÿzCSendfileMixin.test_sendfile_force_fallback..sendfile_native)rˆrr”rMrŽrrEr&rrnr"r=rrro)rr~r€r˜rqr rr Útest_sendfile_force_fallback8s  ÿ  z*SendfileMixin.test_sendfile_force_fallbackcsÆtjdkr"tˆjtjƒr"ˆ d¡ˆ ¡\}}‡fdd„}|ˆj_ˆ  tj d¡,ˆ  ˆjj |j ˆjdd¡Wdƒn1s‚0Y|j  ¡ˆ  |j¡ˆ |jd¡ˆ ˆj ¡d¡dS) Nr‰zFails on proactor event loopcstj ˆj||||¡Srr“r•rr r r˜Qs ÿzMSendfileMixin.test_sendfile_force_unsupported_native..sendfile_nativer‹F©Úfallbackr)ÚsysÚplatformÚ isinstancerr ÚProactorEventLooprƒrˆr”rŒZSendfileNotAvailableErrorrMrŽrrEr&rrnrro)rr~r€r˜r rr Ú&test_sendfile_force_unsupported_nativeKs$    ÿÿÿ"  z4SendfileMixin.test_sendfile_force_unsupported_nativecCs|jdd\}}| |j |j|j¡¡}|j ¡| |j¡| |t |j ƒ¡| |j t |j ƒ¡| |j |j ¡| |j  ¡t |j ƒ¡dS)NT©r}rr‘r r r Útest_sendfile_sslcsÿ  zSendfileMixin.test_sendfile_sslcCsŠ| ¡\}}|j ¡| td¡(| |j |j|j¡¡Wdƒn1sP0Y| |j ¡|  |j d¡|  |j  ¡d¡dS)Nz is closingr) rˆrr&rŒrrMrrŽrErrnrro©rr~r€r r r Ú test_sendfile_for_closing_transpns  6 z.SendfileMixin.test_sendfile_for_closing_transpcCs¨| ¡\}}dd}dd}|j |¡| |j |j|j¡¡}|j |¡|j ¡| |j¡|  |t |j ƒ¡|  |j ||j |¡|  |j  ¡t |j ƒ¡dS)NsPREFIX__és--SUFFIX©rˆrr<rMrrŽrEr&rrnr"r=rro©rr~r€ZPREFIXZSUFFIXrqr r r Útest_sendfile_pre_and_post_dataws  ÿ   z-SendfileMixin.test_sendfile_pre_and_post_datacCs¬|jdd\}}dd}dd}|j |¡| |j |j|j¡¡}|j |¡|j ¡| |j¡|  |t |j ƒ¡|  |j ||j |¡|  |j  ¡t |j ƒ¡dS)NTr¡szxcvbnmr¥s 0987654321r¦r§r r r Ú#test_sendfile_ssl_pre_and_post_data…s ÿ   z1SendfileMixin.test_sendfile_ssl_pre_and_post_datacCs†| ¡\}}| |j |j|jdd¡¡}|j ¡| |j¡| |d¡| |j d¡| |j |j dd…¡| |j  ¡d¡dS)NrsédéL© rˆrMrrŽrrEr&rrnrrr=ror‘r r r Útest_sendfile_partial“s ÿ   z#SendfileMixin.test_sendfile_partialcCsŠ|jdd\}}| |j |j|jdd¡¡}|j ¡| |j¡| |d¡| |j d¡| |j |j dd…¡| |j  ¡d¡dS)NTr¡rsrªr«r¬r‘r r r Útest_sendfile_ssl_partialžsÿ   z'SendfileMixin.test_sendfile_ssl_partialcCs–|jt|jƒd\}}| |j |j|j¡¡}|j ¡| |j ¡|  |t|jƒ¡|  |j t|jƒ¡|  |j |j¡|  |j  ¡t|jƒ¡dS)N©r)rˆr"r=rMrrŽrrEr&rrnrrror‘r r r Ú(test_sendfile_close_peer_after_receiving©sÿ ÿ  z6SendfileMixin.test_sendfile_close_peer_after_receivingcCsŽ|jdt|jƒd\}}| |j |j|j¡¡}| |j¡|  |t|jƒ¡|  |j t|jƒ¡|  |j |j¡|  |j  ¡t|jƒ¡dS)NTr|) rˆr"r=rMrrŽrrErrnrrror‘r r r Ú,test_sendfile_ssl_close_peer_after_receivingµs ÿ ÿ z:SendfileMixin.test_sendfile_ssl_close_peer_after_receivingZsunoszDoesn't work on SolariscCsÎ|jdd\}}| t¡(| |j |j|j¡¡Wdƒn1sH0Y| |j¡|  d|j ko|t |j ƒkn|j ¡|  d|j  ¡koªt |j ƒkn|j  ¡¡|  |j ¡¡dS)Nr¥r¯)rˆÚ assertRaisesÚConnectionErrorrMrrŽrrErÚ assertTruerr"r=roÚ is_closingr£r r r Ú3test_sendfile_close_peer_in_the_middle_of_receivingÄs ÿ" "ÿ&ÿzASendfileMixin.test_sendfile_close_peer_in_the_middle_of_receivingcsÒ‡fdd„}|ˆj_ˆjdd\}}ˆ t¡(ˆ ˆj |jˆj¡¡Wdƒn1s\0Yˆ |j ¡ˆ  d|j kot ˆj ƒkn|j ¡ˆ  dˆj ¡ko¾t ˆj ƒknˆj ¡¡dS)Ncstj ˆj||||¡Srr“r•rr r r˜Õs ÿzcSendfileMixin.test_sendfile_fallback_close_peer_in_the_middle_of_receiving..sendfile_nativer¥r¯)rr”rˆr²r³rMrŽrrErr´rr"r=ro)rr˜r~r€r rr Ú.corozsendfile is in progresssdata) rˆrrZ create_taskrMrŒrrr<rnr"r=)rr~rLÚtrqr r¸r Ú!test_sendfile_prevents_bare_writeçs   ÿ* z/SendfileMixin.test_sendfile_prevents_bare_writecCsht ¡}dd„|j_tjj|_| t d¡*|j   |j j |ddd¡Wdƒn1sZ0YdS)NcSsdSr/r r r r r rbûrczPSendfileMixin.test_sendfile_no_fallback_for_fallback_transport..zfallback is disabledFrš) rZMockrµZ side_effectrZ _SendfileModeZFALLBACKZ_sendfile_compatiblerŒrrrKrŽrr r r Ú0test_sendfile_no_fallback_for_fallback_transportùs  ÿz>SendfileMixin.test_sendfile_no_fallback_for_fallback_transportN)r*r+r,rˆÚunittestZskipIfrœrrr’r™r r¢r¤r¨r©r­r®r°r±Ú startswithr¶r·ÚhasattrÚosrºr»r r r r r{ïs0+       ÿ ÿ r{c@s eZdZdS)ÚSendfileTestsBaseN)r*r+r,r r r r rÀsrÀr‰c@seZdZdd„ZdS)ÚSelectEventLoopTestscCst ¡Sr)r ÚSelectorEventLooprr r r r8 sú&SelectEventLoopTests.create_event_loopN©r*r+r,r8r r r r rÁsrÁc@seZdZdd„ZdS)ÚProactorEventLoopTestscCst ¡Sr)r rŸrr r r r8sz(ProactorEventLoopTests.create_event_loopNrÄr r r r rÅsrÅÚKqueueSelectorc@seZdZdd„ZdS)ÚKqueueEventLoopTestscCst t ¡¡Sr)r rÂÚ selectorsrÆrr r r r8sÿz&KqueueEventLoopTests.create_event_loopNrÄr r r r rÇsrÇÚ EpollSelectorc@seZdZdd„ZdS)ÚEPollEventLoopTestscCst t ¡¡Sr)r rÂrÈrÉrr r r r8#sz%EPollEventLoopTests.create_event_loopNrÄr r r r rÊ srÊÚ PollSelectorc@seZdZdd„ZdS)ÚPollEventLoopTestscCst t ¡¡Sr)r rÂrÈrËrr r r r8*sz$PollEventLoopTests.create_event_loopNrÄr r r r rÌ'srÌc@seZdZdd„ZdS)rÁcCst t ¡¡Sr)r rÂrÈÚSelectSelectorrr r r r81srÃNrÄr r r r rÁ.s)$Ú__doc__r r¿rSrœrur¼rrrÚtestrZ test.supportrZtest.test_asynciorrHrÚ ImportErrorr ÚProtocolr r.r5rPr{rÀrZTestCaserÁrÅrÈr¾rÇrÊrÌr r r r Ús`         &*m  ÿ ÿ  ÿ  ÿ  ÿ ÿ