ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙa 3g@sTddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZddlZddlZz ddlZWneydZYn0ddl m!Z!ddl"m#Z#m$Z$ddl"m%Z%e#dZ&e#dZ'e#dZ(ej)*d Z+ej)*d Z,ej)dd d kZ-zddl.Z.ddl/Z/d Z0WneydZ0Yn0z ddl1Z1WneydZ1Yn0ddZ2ddZ3dBddZ4ddZ5dCddZ6ddZ7ddZ8e8Z9ddZ:Gdd d Z;Gd!d"d"e;ej<Z=Gd#d$d$e;ej<Z>Gd%d&d&e;ej<Z?Gd'd(d(e;ej<Z@Gd)d*d*e;ej<ZAGd+d,d,e;ej<ZBGd-d.d.eBZCGd/d0d0e;ej<ZDGd1d2d2ej<ZEGd3d4d4ej<ZFGd5d6d6eGZHeIe9 d7Gd8d9d9eHej<ZJeIe+ d:Gd;d<dd>ej<ZLGd?d@d@ej<ZMeNdAkrPeOdS)DN) make_archiveregister_archive_formatunregister_archive_formatget_archive_formatsErrorunpack_archiveregister_unpack_format RegistryErrorunregister_unpack_formatget_unpack_formats SameFileError_GiveupOnFastCopy)support)TESTFNFakePath)warnings_helper2Z_SRCZ_DSTdarwinZsunosZaixTFcOstttddddS)NZEXDEVzInvalid cross-device link)OSErrorgetattrerrnoargskwargsr//opt/python39/lib/python3.9/test/test_shutil.py _fake_rename6srcstfdd}|S)Ncs0z"tj}tt_|i|W|t_S|t_0dSN)osrenamer)rrZbuiltin_renamefuncrrwrap;szmock_rename..wrap) functoolswraps)r#r$rr"r mock_rename:sr'cCsVt|trtjj|}t||r"dnd}||Wdn1sH0YdS)zWrite *content* to a file located at *path*. If *path* is a tuple instead of a string, os.path.join will be used to make a path. If *binary* is true, the file will be opened in binary mode. wbwN) isinstancetupler pathjoinopenwrite)r,Zcontentbinaryfprrr write_fileEs  r2cCsdd}t|d}dddt|D}t|d*}|||D]}||q@Wdn1sd0Ytj||ksJdS) zBCreate a test file with an arbitrary size and random text content.css2||ks J||kr$|V||8}q |r.|VdSrr)totalsteprrrchunksSs   zwrite_test_file..chunksi cSsg|]}ttjqSr)randomchoicestring ascii_lettersencode).0irrr \sz#write_test_file..r(N)minr-ranger.r/r r,getsize)r,sizer5bufsizechunkfZcsizerrrwrite_test_fileQs   *rFcCsTt|trtjj|}t||r"dnd}|WdS1sF0YdS)zReturn contents from a file located at *path*. If *path* is a tuple instead of a string, os.path.join will be used to make a path. If *binary* is true, the file will be opened in binary mode. rbrN)r*r+r r,r-r.read)r,r0r1rrr read_filecs  rJcCs|g}tt|D]d}tj||}tj|rltj|sl||dt|D]}||d|qRq||q|S)N/) sortedr listdirr,r-isdirislinkappendrlistdir)r,resnamepnrrrrQos  rQc CsttdsdSd}d}ztjdtdd }|j}|dWdn1sT0Yt|d }tjdtdd}|j}|}|}zt ||ddWnTt yYWdWdW|durt ||durt |dS0WdWdW|dur0t ||durDt |d SWdn1s^0YWdn1s~0YW|durt ||durt |n*|durt ||durt |0dS) NsendfileFr(dirdeletes 0123456789rGrT) hasattrr tempfileNamedTemporaryFilegetcwdrSr/r.filenorVrrunlink)srcnamedstnamerEsrcdstinfdoutfdrrrsupports_file2file_sendfile{sH (      F      rgcCsJtrBtjdkrBtdtj}|ddd}t|ddkSdSdS) Niz/usr/bin/dump -o %s i T)AIXsysmaxsize subprocess getoutput executablesplitint)ZhdrsZmaxdatarrr _maxdataOKs rtc@seZdZdddZdS)BaseTestNcCs$tj|td}|tj||S)zjCreate a temporary directory that will be cleaned up. Returns the path of the directory. )prefixrX)r\mkdtempr r^ addCleanuprrmtree)selfrvdrrrrwszBaseTest.mkdtemp)N)__name__ __module__ __qualname__rwrrrrrusruc@seZdZddZejddZejddZe e ddd Z e e dd d Z d d Z eejdddkdeeedoedkdddZddZddZddZddZejdd Ze e dd!d"ZdS)# TestRmTreecCsX|}tj|d}t|ttj|ddt|}||tt |dS)NZkillmeZsomefilefoo) rwr r,r-mkdirr2fsencodeassertIsInstancebytesshutilry)rztmpZvictimrrrtest_rmtree_works_on_bytess   z%TestRmTree.test_rmtree_works_on_bytescs|}tj|d}t|tj|d}t|||ttj || tj || tj |gfdd}tj ||d| td|ddtjj| dd||dddtdS) NrXlinkcs|dSrrPrerrorsrronerrorsz8TestRmTree.test_rmtree_fails_on_symlink..onerrorrrjrrZ)rwr r,r-rsymlink assertRaisesrrry assertTrueexistslexists assertEquallenassertIsrOrrzrZdir_rrrrrtest_rmtree_fails_on_symlinks   z'TestRmTree.test_rmtree_fails_on_symlinkc Cs|}tj|d}tj|d}tj|d}|||fD]}t|q.onerrorrrjrrZ)rwr r,r-r_winapiCreateJunctionrxrr`rrrryrrrrrrrOrrrrrtest_rmtree_fails_on_junctionss    z)TestRmTree.test_rmtree_fails_on_junctionsc Cs|}tj|d}tj|d}tj|d}|||fD]}t|q.onerrorrrZrrj)r\mktemprwrFileNotFoundErrorrryr2r r,r-NotADirectoryErrorassertIn exceptionfilenamerrrrrscandirrrmdir)rzrtmpdircmZ possible_argsrrrrtest_rmtree_errorss2 ( zTestRmTree.test_rmtree_errorsNcygwinz2This test can't be run on Cygwin (issue #1071513).geteuidrz9This test can't be run reliably as root (issue #1076467).cCs d|_tt|tjttjtd|_ tjtd|_ t |j t|j t tj}t |j j}t |j j}t jt jB}t|j |t|j |tt||tjt||tj|j ||tj|j |tjt|jd||jdddS)Nrabrrz1Expected call to onerror function did not happen.) errorStater rrrxrryr,r-child_file_pathchild_dir_pathrcreate_empty_filestatst_modeS_IREADS_IEXECchmodcheck_args_to_onerrorr)rzZ old_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moderrr test_on_error5s*       zTestRmTree.test_on_errorcCs|jdkr|tjur$|||jn:|tjur>|||jn ||tj| |t |jg| t |dt |jd7_n4||tj||t | t |dt d|_dS)NrZrrjr)rr r`rrrrrrMrrr issubclassr)rzr#argexcrrrrTs    z TestRmTree.check_args_to_onerrorcsRzDtjfdd}|t_ttttdfdttWt_nt_0dS)Ncs|tkrtn|SdSr)rr)fnrrZ orig_lstatrrraiserrszFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat..raiserr)r lstatrrr2rry)rzrrrr+test_rmtree_does_not_choke_on_failing_lstatos   z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatcstjtjtjtjhtjko0tjtjvo0tjtjv}|r| t j | t j j |}tj|d}t|zBt j}Gdddtfdd}|t _|t j |W|t _q|t _0n|t j |t j j dS)Nrc@s eZdZdS)zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available..CalledN)r|r}r~rrrrCalledr6rcsdSrrrrrr_raiserszITestRmTree.test_rmtree_uses_safe_fd_version_if_available.._raiser)r r.rr`rsupports_dir_fdrM supports_fdsupports_follow_symlinksrr_use_fd_functionsryavoids_symlink_attacksrwr,r-r_rmtree_safe_fd Exceptionrr)rzrtmp_dirr{Z real_rmtreerrrr-test_rmtree_uses_safe_fd_version_if_availables,      z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablecCs<tj|d\}}t||ttj|t |dSNr) r\mkstemprwr closerrrryremove)rzhandler,rrrtest_rmtree_dont_delete_files z'TestRmTree.test_rmtree_dont_delete_filec Csttzbtjtd}tjtd}t|t|||ttj |tj |ddWtj tddntj tdd0dS)NcheeseshopTr) r rrr,r-rrrrryrzrcrdrrrtest_rmtree_on_symlinks   z!TestRmTree.test_rmtree_on_symlinkc Csttzztjtd}tjtd}t|ttj|ddt||| t t j |t j |ddWt j tddnt j tdd0dS)NrrZspamr(Tr) r rrr,r-r.rrrrrrryrrrrtest_rmtree_on_junctions   z"TestRmTree.test_rmtree_on_junction)r|r}r~rrskip_unless_symlinkrrunittest skipUnlessrrrrskipIfrmplatformr[r rrrrrrrrrrrrrs2       $  rc@seZdZddZddZejddZddZd d Z d d Z e j d ddZddZe eeddejddZddZejddZejddZddZddZd S)! TestCopyTreec Cs|}tj|d}|tj||tjtj|t|dfdt tj|dt|ddfdt ||| tj tj|d| tj tj|d| tj tj|ddt|df}||dt|ddf}||ddS)N destinationtest.txt123test_dir456)rwr r,r-rxrrydirnamer2rcopytreerisfilerNrJrrzsrc_dirdst_diractualrrrtest_copytree_simples"   z!TestCopyTree.test_copytree_simplec CsZ|}|}|tj||tj|t|dfdttj|dttj|dt|ddfdt|ddfdtj ||dd| tj tj|d| tj tj|d| tj tj|ddt |df}||dt |ddf}||d|t tj ||d dWdn1sL0YdS) Nznonexisting.txtrZ existing_dirz existing.txtzwill be replacedzhas been replacedT) dirs_exist_okF)rwrxrryr2r rr,r-rrrrNrJrrFileExistsErrorrrrrtest_copytree_dirs_exist_oks*    z(TestCopyTree.test_copytree_dirs_exist_okc Cs|}tj|d}tj|d}tj|d}t|t|t|dfdtj|d}tj|d}ttj|d|ttdrt|t j t j Bttd rtt d rt |t j t|}tj||d d |tjtj|ddttj|dd}tjd kr8|dr8|dd}||tj|dt|} ttdrt|| j|jttd r|| j|jdS)Nrcrdsubzfile.txtrrzsub/linklchmodlchflags UF_NODUMPTsymlinksntz\\?\)rwr r,r-rr2rr[rrS_IRWXUS_IRWXOrrrrrrrOreadlinkrS startswithrrst_flags) rzrrrZsub_dirsrc_linkdst_linksrc_statrdst_statrrrtest_copytree_symlinkss8        z#TestCopyTree.test_copytree_symlinksc Cs^tjj}tjj}|}z ||d}t|dfdt|dfdt||dt|ddfdt||dt|ddfdt||ddt||dd t|dddfdt|dd d fdzftd d}tj |||d | |||d| |||d| |||dWt |n t |0zjtd d }tj |||d | |||d| |||dd | |||ddWt |n t |0zTdd}tj |||d | |||dd d | |||ddWt |n t |0Wt |t tj |nt |t tj |0dS)Nrrrztest.tmprrZ test_dir2subdirZsubdir2ztest.pyz*.tmpignorezsubdir*cSsfg}|D]X}tj||}tj|rB|ddkrB||qtj|ddvr||q|S)Nrirz.py)r r,r-rNrrrPsplitext)rcnamesrRrSr,rrr_filter1s   z8TestCopyTree.test_copytree_with_exclude.._filter)r r,r-rrwr2rrignore_patternsrrrryr)rzr-rrrpatternsrrrrtest_copytree_with_exclude sR     z'TestCopyTree.test_copytree_with_excludecsVtjj}tjj}}||d}t||t||dttj|ddt|dddfdgfdd}|d}tj|||d  |||ddd|d}tjt |||d  |||ddd|d}t t |d }|tjtj|||d  |||dddtd dS) NsourcerrrrcsT||t|tt|tt||D]}|tq>gSr)rPrstrlistrrset)rcrrSZ invokationsrzrr_ignoreXs   z?TestCopyTree.test_copytree_arg_types_of_ignore.._ignorerrr )r r,r-rrwrr2rrrpathlibPathrrrDirEntryrr)rzr-rrrrrZ src_dir_entryrrr!test_copytree_arg_types_of_ignoreJs8  z.TestCopyTree.test_copytree_arg_types_of_ignorec Csx|}tj|d}t|tj|d}|tj|t|dt |dfdttj|ddt |dfdttj|ddt j|d }|t j|t|dt ||| t|jt|j| ttj|djttj|dj| ttj|djttj|djtj|tj|d }| t|jt|jdS) Nrrizpermissive.txtrzrestrictive.txtrirrj)rwr r,r-rrxrryrr2r\rrrrrrr)rzrrrZrestrictive_subdirZrestrictive_subdir_dstrrr!test_copytree_retains_permissionsts6      z.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs|}tj|d}|tj||tjtj|td|_ | tj t ||Wdn1sv0YdS)Nrzka-boom) rwr r,r-rxrryrPermissionError side_effectrrr)rzZ mock_patchrrrrrtest_copytree_winerrors z#TestCopyTree.test_copytree_winerrorcsfdd}gtjdttjdd}|Wdn1s`0Ytj |d t ddS)NcsRd|t|t|tjd|tjddSNr)rPrrrr r,r-)rrrdflagrzrcrr custom_cpfuns    zETestCopyTree.test_copytree_custom_copy_function..custom_cpfunrrr) copy_functionrj) rwr\rr.r r,r-rrrrr)rzr)rErr'r"test_copytree_custom_copy_functions&z/TestCopyTree.test_copytree_custom_copy_functionmkfiforequires os.mkfifo()c Cs2ttztjtd}t|tj|d}zt|Wn2tyt}z|d|WYd}~n d}~00zt tt Wn^tj y}zD|j d}| t|d|d\}}}| d||WYd}~nd}~00|dWtjtdd tjt dd ntjtdd tjt dd 0dS) NrZmypipeos.mkfifo(): %srrjz`%s` is a named pipez$shutil.Error should have been raisedTr)r rrr,r-r-r#skipTestrrTESTFN2rrrrfailry)rzrpipeerrcrdZ error_msgrrrtest_copytree_named_pipes*  $ & z%TestCopyTree.test_copytree_named_pipecs|}tj|d}t|dfdttj|dt|ddfdgfdd}tj|||d|t d dS) Nrrrrrcs||fdSrrrcrdZcopiedrr_copysz6TestCopyTree.test_copytree_special_func.._copyr*rZ) rwr r,r-r2rrrrr)rzrrr8rr7rtest_copytree_special_funcs z'TestCopyTree.test_copytree_special_funccCs|}tj|d}tdtj|dttj|dt|ddfd|tt j ||tj|d}t j ||dd| dt |tj|d }t j ||dd | dt |dS) NrZ IDONTEXISTrrr destination2T)ignore_dangling_symlinksZ destination3r)rwr r,r-rrr2rrrr assertNotInrMrrzrrrrrtest_copytree_dangling_symlinkssz,TestCopyTree.test_copytree_dangling_symlinksc Cs.|}tj|d}ttj|dttj|dddWdn1sZ0Ytjtj|dtj|dddtj||dd | tj tj|d| dt tj|dtj|d }tj||dd | tj tj|d| dt tj|ddS) NrZreal_dirrr)Z link_to_dirT)target_is_directoryFrr:)rwr r,r-rr.rrrrrOrrMrr=rrrtest_copytree_symlink_dirs  z&TestCopyTree.test_copytree_symlink_dircCs\|}|d}|tj|dtj|d}t|dt||}| dgt |dS)NdestTr) rwrxrryr r,r-r2rrrM)rzrrrcrvrrrtest_copytree_return_values  z'TestCopyTree.test_copytree_return_valuecCs|}|jtj|ddtj|dd}tj|dd}t|tj|d}t|dt ||}| dgt |dS)NTrtZpgZ somevendorz1.0Zpol) rwrxrryr r,r-makedirsr2rrrM)rzbase_dirrrrcrBrrrtest_copytree_subdirectorys   z'TestCopyTree.test_copytree_subdirectoryN)r|r}r~rrrrr rr!r"rmockpatchr%r,rr[r r5r9r>r@rCrGrrrrrs( A*      rc@seZdZejddZeee ddejddZ e ee ddejdd Z ejd d Z eee d oeed oeeddddZejddZejejeee doe dkdddZddZddZejddZeee dd d!d"Zejd#d$Zejd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zejd/d0Zeee d1d2d3d4Zejd5d6Z eee d7d8d9d:Z!d;d<Z"d=d>Z#e e$pe%pe&d?d@dAZ'dBdCZ(dDS)ETestCopycCs|}tj|d}tj|d}tj|d}tj|d}t|dt|dt||t||t|tjtj Bt|tj | t|j t|j t |||t|j t|j tjdkrt|tj t |||t|j t|j t|tj t |||t|j t|j t|tj t |||t|j t|j dS)Nrbarbazquuxr)rwr r,r-r2rrrrS_IRWXGrassertNotEqualrrcopymoderrSrzrrcrdr r rrrtest_copymode_follow_symlinkss0         z&TestCopy.test_copymode_follow_symlinksrzrequires os.lchmodcCsp|}tj|d}tj|d}tj|d}tj|d}t|dt|dt||t||t|tjtj Bt|tjt |tj tj Bt |tj t j ||dd|t|jt|j|t|jt|jt |tj t j ||dd|t|jt|jt |tj t j ||dd|t|jt|jdSNrrKrLrMFfollow_symlinks)rwr r,r-r2rrrrrNrrrrPrrrrOrQrrr test_copymode_symlink_to_symlink8s0     z)TestCopy.test_copymode_symlink_to_symlinkz requires os.lchmod to be missingcCs|}tj|d}tj|d}tj|d}tj|d}t|dt|dt||t||tj||dddSrS)rwr r,r-r2rrrPrQrrr*test_copymode_symlink_to_symlink_wo_lchmodVs    z3TestCopy.test_copymode_symlink_to_symlink_wo_lchmodc Cs|}tj|d}tj|d}tj|d}tj|d}t|dt|}t||j|jdft|d| t|jt|jt ||t ||t tdrt |tj t tdrt tdrt|tjt|}t tdr tj||d d | |jt|jtj||d d t|}tjtjvrpd D]"} |t|| t|| d qLt tdr||j|jt tdrt |dr||j|jtj||d d |tt|jt|jdkdS)NrrKrLquxgE@rrrTrTFst_atimest_mtimerjrg?)rwr r,r-r2rutimerZr[rOrr[rrrrrrcopystatrrassertLessEqualrrrrabs) rzrrcrdr r r  src_link_statZ dst_link_statattrrrrtest_copystat_symlinksfsJ             zTestCopy.test_copystat_symlinkschflags EOPNOTSUPPENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPcCs|}tj|d}tj|d}t|dt|ddd}tj}zVtjtjfD]}||t_t ||qT|tjtjt_| t t j ||W|t_n|t_0dS)Nrfile2xxxcstddfdd }|S)NTrTcs_dSr)r)r,flagsrUerrexrr_chflags_raiserszlTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser.._chflags_raiserr)rjrlrrirmake_chflags_raiserszSTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser) rwr r,r-r2rcrrdrerr]rr)rzrrrfrnZ old_chflagsrjrrr-test_copystat_handles_harmless_chflags_errorss   z6TestCopy.test_copystat_handles_harmless_chflags_errorscs |}tj|dtdtj|d}t|dt|tddtddt||t t t t ||t dt |dt |t|dt tjdfdd }z4tj|t_t||dt |Wt_nt_0d d fd d }z"tj |t_ t|Wt_ nt_ 0tj|dtj|d}tt||tddt|ddt|dtj|d}tj|d}t||t||t|t|||t |dd|t |dddS)NrrKuser.foo42zuser.bar43EPERMcs&|dkrn|||fi|dS)Nrpr)fnameravalr) orig_setxattros_errorrr_raise_on_user_foosz3TestCopy.test_copyxattr.._raise_on_user_fooTrTcs |krttjd||dS)NzOperation not supportedrT)rrre)rtrU)orig_listxattrrcrr _raise_on_srcs z.TestCopy.test_copyxattr.._raise_on_srcZ the_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZ the_copy_ro)rwr r,r-r2r _copyxattrsetxattrrrL listxattrgetxattrrrrrsrrr])rzrrdrxrzZsrcroZdstror)ryrvrwrcrtest_copyxattrsZ                  zTestCopy.test_copyxattrrrroot privileges requiredcCs|}tj|d}tj|d}t|dt||t|ddtj|ddddtj|d}tj|d }t|dt||tj||dd| tj |dddd| t tj |dtj||dd| t |dddS) NrrLz trusted.foorqrrFrTrKrX) rwr r,r-r2rr|rr{rr~rr)rzrrcr rdr rrrtest_copyxattr_symlinkss     z TestCopy.test_copyxattr_symlinkscCsPd}|}t||fdtj||}|}|||tj||}||fS)Nrrg)rwr2r r,r-)rzmethodrtrrtmpdir2rfrrr _copy_file s zTestCopy._copy_filecCsB|tj\}}|tj||t|j t|j dSr) rrcopyrr r,rrrr)rzrrfrrr test_copyszTestCopy.test_copycCs |}tj|d}tj|d}tj|d}t|dt||ttdrft|tj tj Bt j ||dd| tj||t|t|t|t j ||dd|tj||t|t|ttdr|t|jt|jdS)NrrKrLrTrTF)rwr r,r-r2rr[rrrrrrrrOrrJrrrrr)rzrrcrdr rrrtest_copy_symlinkss&      zTestCopy.test_copy_symlinksr\zrequires os.utimecCs|tj\}}|tj|t|}t|}||j |j dD] }| t ||t ||dqJt tdrt |dr|t |dt |ddS)NrYrjrcr) rrcopy2rr r,rrrrr^rr[)rzrrfZ file1_statZ file2_statrarrr test_copy22s     zTestCopy.test_copy2c Cs|}tj|d}tj|d}tj|d}t|dt||ttdrft|tj tj Bttdrttdrt |tj t|}t |}tj||dd|tj||t|t|t|tj||d d|tj||t|t|t |}tjtjvrVd D]"}|t||t||d q2ttdr||j|j||j|jttdrt|d r||j|jdS) NrrKrLrrrTrTFrYrjr)rwr r,r-r2rr[rrrrrrrrrrrOrrJrrrr\rr^rrrOr) rzrrcrdr r r`r rarrrtest_copy2_symlinksCs<          zTestCopy.test_copy2_symlinkscCsr|}tj|d}tj|d}t|dt|ddt|||t |dt |dt |dS)NrrKrprq) rwr r,r-r2r|rrrr~r)rzrrcrdrrrtest_copy2_xattrfs    zTestCopy.test_copy2_xattrcCstjtjfD]v}|}|}tj|d}t|d|||}||tj|d||tj|d}||tj|dq dS)NrrK) rrrrwr r,r-r2r)rzrrrrcrBrrrtest_copy_return_valuess  zTestCopy.test_copy_return_valuecCs|tjdSr)_test_copy_dirrrrzrrr test_copy_dirszTestCopy.test_copy_dircCs|tjdSr)rrrrrrrtest_copy2_dirszTestCopy.test_copy2_dircCsx|}tj|d}|}tj|d}t|dtjdkrFt}nt}| ||||| |||||||dSNrdoes_not_exist/win32) rwr r,r-r2rmrr#IsADirectoryErrorr)rzZ copy_funcrsrc_filerrdrjrrrrs  zTestCopy._test_copy_dircCs|}tj|d}tj|d}tj|d}tj|d}t|dt||tj||dd|tj || t |t |t||| tj |dS)Nrcrdr rrFrT) rwr r,r-r2rrcopyfilerrOrrr)rzrrcrdr rrrrtest_copyfile_symlinkss   zTestCopy.test_copyfile_symlinksrzrequires os.linkc Cstttjtd}tjtd}zt|d}|dWdn1sR0Yzt||Wn2ty}z| d|WYd}~n d}~00| t j t j ||t|d }||dWdn1s0Yt|Wt jtddnt jtdd0dS) Nrrr)cheddarz os.link(): %srHTr)r rrr,r-r.r/rr#r0rrr rrrIrry)rzrcrdrEr4rrr'test_dont_copy_file_onto_link_to_itselfs  ($ . z0TestCopy.test_dont_copy_file_onto_link_to_itselfc Cstttjtd}tjtd}zt|d}|dWdn1sR0Ytd||t j t j ||t|d }| | dWdn1s0Yt|Wt jtddnt jtdd0dS)Nrrr)rrHTr)r rrr,r-r.r/rrrr rrrIrry)rzrcrdrErrr*test_dont_copy_file_onto_symlink_to_itselfs  (  . z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr-r.c CszttWn2ty@}z|d|WYd}~n d}~00z6|tjtjtt |tjtjt tWt tn t t0dS)Nr/) r r-rr#r0rrSpecialFileErrorrr1__file__r)rzr4rrrtest_copyfile_named_pipes$z!TestCopy.test_copyfile_named_pipecCsl|}|}tj|d}tj|d}t|dt||}|tj|| t |t |dS)NrKr) rwr r,r-r2rrrrrrJ)rzrrdst_filerrBrrrtest_copyfile_return_values  z#TestCopy.test_copyfile_return_valuecCsX|}tj|d}t|d|ttj|||t tj||| t |ddSr&) rwr r,r-r2rr rrrrrJ)rzrrrrrtest_copyfile_same_files  z TestCopy.test_copyfile_same_filezMOn MACOS, Solaris and Windows the errors are not confusing (though different)cCsD|}tj|d}tj|d}t|d|ttj||dS)Nrr) rwr r,r-r2rrrr)rzrrrdrrrtest_copyfile_nonexistent_dirs  z&TestCopy.test_copyfile_nonexistent_dircCs|}tj|d}|}tj|d}t|dtjdkrFt}nt}| |t j ||| |t j ||| |t j ||dSr) rwr r,r-r2rmrr#rrrr)rzrrrrdrjrrrtest_copyfile_copy_dirs  zTestCopy.test_copyfile_copy_dirN))r|r}r~rrrRrrr[r rVrrWrbrroZskip_unless_xattrrrrrrrrrrrrrrrrrrrrMACOSSOLARISrrrrrrrrJsh    (  ?    "         rJc@s~eZdZeddZddZd9ddZee e dd d d Z ed d Z ee e ddddZee e ddddZddZeddZee edddZddZdd Zed!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zed-d.Zed/d0Zee e!oRe" d1d2d3Z#ed4d5Z$d6d7Z%d8S): TestArchivesc Cs|d\}}|}t|tj|}tjtj|d}t |*tj |}t |d|d}Wdn1s|0Y| ||d| tj|| t|t|d$}||gdWdn1s0Yt |t |d|d}Wdn1s(0Y| ||d | tj|| t|t|d $}||gdWdn1s0YdS) Nrarchivegztar..tar.gzzr:gz)rz./subz./sub2z./file1z./file2z ./sub/file3tar.tarrH) _create_filesrwr rr,rr-basenamer change_cwdabspathrrrrtarfileZ is_tarfiler.assertCountEqualgetnames) rzroot_dirrFrwork_dir rel_base_name base_nametarballZtfrrrtest_make_tarballs0    , " . zTestArchives.test_make_tarballcCsFt|(}|}|t|WdS1s80YdSr)rr.rsortr+)rzr,rrrrr_tarinfo:s zTestArchives._tarinfodistcCs|}tj||}tj|ddt|dfdt|dfdttj|dt|ddfdttj|d|rt|d fd||fS) NT)exist_okrrgrfrZfile3Zsub2outer)rwr r,r-rEr2r)rzrFrrrrrr@szTestArchives._create_filesrzNeed the tar command to runcCs |\}}tj|d}t|d||}|||d|tj|tj|d}ddd|g}t j ||t j d|tj||| || |t|d||}|||d|tj|t|d||d d }|||d|tj|dS) Nrrrz archive2.tarrz-cfcwdstdoutrT)dry_run) rr r,r-rwrrrrro check_callDEVNULLr)rzrrFrrZtarball2Ztar_cmdrrrtest_tarfile_vs_tarNs(   z TestArchives.test_tarfile_vs_tarc Cs|\}}|}t|tj|}tjtj|d}t |(tj |}t |d|}Wdn1sx0Y| ||d| tj|| t|t|$}||gdWdn1s0Yt |*tj |}t |d||}Wdn1s.0Y| ||d| tj|| t|t|$}||gdWdn1s0YdS)Nrzip.zip)dist/ dist/sub/ dist/sub2/ dist/file1 dist/file2dist/sub/file3r)rrrrrr)rrwr rr,rr-rrrrrrrrzipfile is_zipfileZipFilernamelist) rzrrFrrrrrRzfrrrtest_make_zipfileos2     *  "  .  zTestArchives.test_make_zipfilerzNeed the zip command to runc Cs |\}}tj|d}t|d||}|||d|tj|tj|d}dddd|g}t j ||t j d|tj|t |}|}Wdn1s0Yt |}|} Wdn1s0Y|t|t| dS)Nrrrz archive2.zipz-qz-rr)rr r,r-rwrrrrrorrrrrrL) rzrrFrrZarchive2zip_cmdrrZnames2rrrtest_zipfile_vs_zips   & &z TestArchives.test_zipfile_vs_zipunzipzNeed the unzip command to runc Cs|\}}tj|d}t|d||}|||d|tj|dd|g}t |zt j |t j dWn\t jy}zB|jjdd}d |vr|d d }||||WYd}~n d}~00Wdn1s0YdS) Nrrrrz-t)stderrreplacerzunrecognized option: tzunzip doesn't support -tz{} **Unzip Output** {})rr r,r-rwrrrrrrro check_outputSTDOUTCalledProcessErroroutputdecoder0r2format) rzrrFrrrrZdetailsmsgrrrtest_unzip_zipfiles    zTestArchives.test_unzip_zipfilecCs*|}tj|d}|tt|ddS)Nrrg)rwr r,r-r ValueErrorr)rzrrrrrtest_make_archiveszTestArchives.test_make_archivecCstr"tdd}tdd}nd}}|\}}tj| d}t |d||||d}| tj |t |d||}| tj |t |d||||d}| tj |t |d||ddd}| tj |dS) NrrootrrownergrouprZ kjhkjhkjgZoihohoh) UID_GID_SUPPORTgrpgetgrgidpwdgetpwuidrr r,r-rwrrr)rzrrrrFrrRrrrtest_make_archive_owner_groups(    z*TestArchives.test_make_archive_owner_groupRequires grp and pwd supportc Cs|\}}tj|d}tdd}tdd}t |$t |d|d||d}Wdn1sn0Y| tj |t|}z6|D] }||jd||jdqW|n |0dS)Nrrrrr)rr r,r-rwrrrrrrrrrrr.Z getmembersruidgidr) rzrrFrrr archive_namermemberrrrtest_tarfile_root_owners   $  z$TestArchives.test_tarfile_root_ownercCstt}dd}td|gdzFztdd|dWntyHYn0|t|Wtdn td0dS)Nc_s tdSr) RuntimeError)rkwrrr_breakssz3TestArchives.test_make_archive_cwd.._breaksrgxxx file)r)r r^rrrwrrr)rzZ current_dirrrrrtest_make_archive_cwds z"TestArchives.test_make_archive_cwdcCsZ|}t|4|tddd|tjdWdn1sL0YdS)Ntestrztest.tar rwrrrrrr r,rrzrrrrtest_make_tarfile_in_curdir s z(TestArchives.test_make_tarfile_in_curdircCsZ|}t|4|tddd|tjdWdn1sL0YdS)Nrrztest.ziprrrrrtest_make_zipfile_in_curdirs z(TestArchives.test_make_zipfile_in_curdircCs|ttdd|ttdddd|ttdddddgtddddgd d d tD}|d|tdd d tD}|d|dS) NrgrjcSstSrxrrrrr6z;TestArchives.test_register_archive_format..cSstSrrrrrrr!r6)rjrZ)rjrZrcSstSrrrrrrr$r6rcSsg|] \}}|qSrrr<rSparamsrrrr>%r6z=TestArchives.test_register_archive_format..cSsg|] \}}|qSrrrrrrr>)r6)r TypeErrorrrrrr<)rzformatsrrrtest_register_archive_formats z)TestArchives.test_register_archive_formatcKsF|j|ddfi||j|tjfi||j|tfi|dS)NcSs|Srrr,rrrr0r6z3TestArchives.check_unpack_archive..)#check_unpack_archive_with_converterrrr)rzrrrrrcheck_unpack_archive.sz!TestArchives.check_unpack_archivec Ks.|\}}t|}|dtj|d}t||||}|} t|||| fi|| t| ||} t|||| fd|i|| t| || t j $t|t fi|Wdn1s0Y| t(t|t fddi|Wdn1s 0YdS)Nrrrrg)rrQrr r,r-rwrrrrr ReadErrorrr) rzr converterrrrFexpectedrrrZtmpdir3rrrr5s"  2 z0TestArchives.check_unpack_archive_with_convertercCsT|j|dd|j|ddt|||Wdn1sF0YdS)NZ fully_trustedfilterdata)rrZcheck_no_warnings)rzrrrrcheck_unpack_tarballMs z!TestArchives.check_unpack_tarballcCs|ddS)Nrr rrrrtest_unpack_archive_tarSsz$TestArchives.test_unpack_archive_tarcCs|ddS)Nrrrrrrtest_unpack_archive_gztarVsz&TestArchives.test_unpack_archive_gztarcCs|ddS)Nbztarrrrrrtest_unpack_archive_bztarZsz&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCs|ddS)Nxztarrrrrrtest_unpack_archive_xztar^sz&TestArchives.test_unpack_archive_xztarcCsF|d|t|jdddWdn1s80YdS)Nrr r )rrrrrrrtest_unpack_archive_zipcs  z$TestArchives.test_unpack_archive_zipcst}fdd}tdddg|dgtddttd dg|tdtd dg|d dgd ftddgd fttd t|dS) Ncs(|d|d|ddS)Nrj stuff.booxx)r)r extract_dirextrarrr_booms  z/TestArchives.test_unpack_registry.._booZBooz.booz.b2)rrjrrZBoo2r) r rrrr r rr<r)rzrrrrrtest_unpack_registryis   z!TestArchives.test_unpack_registryN)r)&r|r}r~rZ requires_zlibrrrrrrwhichrrrrrrrrrrrrrrr rrZ requires_bz2rZ requires_lzmarrlrtrrrrrrrrs\ #    $            rc@sLeZdZeeeddddZeedeee dddd Z d S) TestMisc disk_usagez)disk_usage not available on this platformcCsttjt}dD]}|t||tq| |j d| |j d| |j d| |j |j | |j |j ttdS)N)r3usedfreer)rrr r,rrrrrsZ assertGreaterr3rassertGreaterEqualr )rzusagerarrrtest_disk_usageszTestMisc.test_disk_usagerchownzrequires os.chowncs}tj|dtdttWdn1sH0YttjddWdn1s0YttjddWdn1s0Yt tdWdn1s0Yt tdWdn1s&0Yt }t }d fd d }t|||||t|||tj|d||tj|d||d t|||||||t|||||tj||d|||tj||d|||d z t |d }t|d }WntyHYn60t|||||t|||||||dS)Nrztesting chown functionznon-existing username)userznon-existing groupname)rspamgQ @cs:t}|dur ||j|dur6||jdSr)r rrst_uidst_gid)r,rrsrrzrr check_chowns  z(TestMisc.test_chown..check_chown)rr)NN)rwr\rr2rrrr$ LookupErrorrr getuidgetgidrrrrKeyError)rzrrrr+r%rrr*r test_chownsR   ( , , * ,           zTestMisc.test_chownN) r|r}r~rrr[rr#rr r0rrrrrs  rc@seZdZddZddZddZddZd d Ze e e d oHe d kd ddZ ddZddZeejdkdddZddZddZddZddZd d!Zd"d#Zeejdkd$d%d&Zeejdkd$d'd(Zd)S)* TestWhichcCst|jdd|_tj|jddd|_t|jjtj | |jj tj |jj\|_|_|j|_tj|_d|_dS)NZTmp)rvz.ExerXrvsuffixz.EXE)rwtemp_dirr\r] temp_filer rrSrS_IXUSRrxrr,rrrXfileenv_pathcurdirextrrrrsetUpszTestWhich.setUpcCs&tj|j|jd}|||jjdSNr)rrr7rXrr5rSrzrBrrr test_basicszTestWhich.test_basiccCs(tj|jj|jd}|||jjdSr<)rrr5rSr4rr=rrrtest_absolute_cmdszTestWhich.test_absolute_cmdcCstj|j\}}tj||j}tj|d,tj ||j d}| ||Wdn1s`0Ytj|jd(tj ||d}| |Wdn1s0YdSr<) r r,rrrXr-r7rrrrr4r assertIsNone)rzrFtail_dirrelpathrBrrrtest_relative_cmds*zTestWhich.test_relative_cmdcCstj|j}tj|jdPtj|j|d}t j dkrT| |tj |j |jn ||Wdn1sr0YdS)Nrr)r r,rrXrrrrr7rmrrr-r9r@)rzrFrBrrrtest_cwds  zTestWhich.test_cwdrrznon-root user requiredcCsRt|jjtjt|jjtjr.|dt j |j |j tjd}| |dS)Nzcan't set the file read-only)r,mode)r rr5rSrraccessW_OKr0rrr7rXr@r=rrrtest_non_matching_modes  z TestWhich.test_non_matching_modecCsjtj|j\}}tj|d8tj|j|d}| |tj ||jWdn1s\0YdSr<) r r,rrrXrrrrr7rr-)rzrFrArBrrrtest_relative_pathszTestWhich.test_relative_pathcCstjd|jd}||dS)Nzfoo.exer)rrrXr@r=rrrtest_nonexistent_fileszTestWhich.test_nonexistent_filerzpathext check is Windows-onlycCs<tj|jdd|jd}|||jjdd|jdS)Nr)rrr7rXrr5rSr:r=rrrtest_pathext_checkingszTestWhich.test_pathext_checkingcCsRt6}|j|d<t|j}|||jjWdn1sD0YdSNPATH) rEnvironmentVarGuardr8rrr7rr5rSrzenvrBrrrtest_environ_path%s   zTestWhich.test_environ_pathc Cst}d|d<tjjd|jddttd|jRt|j&t |j }| |Wdn1sr0YWdn1s0YWdn1s0YWdn1s0YdS)NrrN os.confstrT return_valuecreatedefpath) rrOrrHrIrX swap_attrr rrrr7r@rPrrrtest_environ_path_empty+s    z!TestWhich.test_environ_path_emptyc Cs:tj|jj}tjdkrBtj}t|t r4t |}tj ||}t }tj|d<tjjd|jddt td|jjt|j}||t |j(t|j}|||Wdn1s0YWdn1s0YWdn1s 0YWdn1s,0YdS)NrrNrSTrTrW)r r,rr5rSrmrr9r*rrr-rrOpathseprrHrIrXrXrrr7r@rr)rzZ expected_cwdr9rQrBrrrtest_environ_path_cwd6s$         zTestWhich.test_environ_path_cwdc Cs8t}|ddtjjdtddLttd|j t |j }Wdn1s^0YWdn1s|0Y| ||jjtjjd|j ddJttddt |j }Wdn1s0YWdn1s0Y| ||jjWdn1s*0YdS)NrNrST)r$rVrWrTr)rrOpoprrHrIrrXr rXrrr7rr5rSrPrrrtest_environ_path_missingLs    H  Hz#TestWhich.test_environ_path_missingc Cstj|j}tj|jd\t4}|j|d<tj |j dd}| |Wdn1s`0YWdn1s~0YdS)NrrNr) r r,rrXrrrOr8rrr7r@)rzrFrQrBrrrtest_empty_path^s zTestWhich.test_empty_pathcCsNt2}|ddt|j}||Wdn1s@0YdSrM)rrOr\rrr7r@rPrrrtest_empty_path_no_PATHfs   z!TestWhich.test_empty_path_no_PATHztest specific to WindowscCsd}tj|jd|d}t|jtj||j tj |j}tj |d}t 6}||d<tj||jd}|||jWdn1s0YdS)N.xyzTmp2r2rPATHEXTr)r\r]r4r rrSrr6rxrr,rrrrOrrrrzr:Z temp_filexyzZprogramrQrBrrr test_pathextls  zTestWhich.test_pathextcCsd}tj|jd|d}||jtj|j}tj |d}t <}|d|d<t j ||jd}|||jWdn1s0YdS)Nr`rar2r;rbr)r\r]r4rxrr r,rrSrrrOrrrrcrrrtest_pathext_with_empty_str~s  z%TestWhich.test_pathext_with_empty_strN)r|r}r~r;r>r?rCrDrrr[r rrHrIrJrrmrrLrRrYr[r]r^r_rdrfrrrrr1s2       r1c@seZdZddZdS)TestWhichBytescCsXt|t|j|_t|j|_t|jj|j_t|j|_t|j |_ dSr) r1r;r rrXr7r5rSr9r:rrrrr;s  zTestWhichBytes.setUpN)r|r}r~r;rrrrrgsrgc@seZdZddZddZddZddZd d Zd d Zd dZ e ddZ e ddZ ddZ e ddZddZe ddZddZeejjdddZd d!Zd"d#Zd$d%Zd&d'Zeje d(d)Zeje d*d+Zeje d,d-Z eje d.d/Z!d0d1Z"d2d3Z#e d4d5Z$e d6d7Z%d8d9Z&ee'ed:ove(d;kove'ed<ove'e)d=ove'e)d>d?d@dAZ*dBS)CTestMovecCsvd}||_||_tj|j||_tj|j||_t|jd}| dWdn1sh0YdS)Nrr(r&) rwrrr r,r-rrr.r/)rzrrErrrr;s  zTestMove.setUpcCst|d}|}Wdn1s(0Yt||t|d }|||Wdn1sn0Y|tj|dSNrG) r.rIrmoverrr r,r)rzrcrdreal_dstrEcontentsrrr_check_move_files  &  .zTestMove._check_move_filecCsFtt|}t||||tt||tj|dSr) rLr rMrrjrrr,r)rzrcrdrkrlrrr_check_move_dirs zTestMove._check_move_dircCs||j|j|jdSr)rmrrrrrrtest_move_fileszTestMove.test_move_filecCs||j|j|jdSr)rmrrrrrrrtest_move_file_to_dirszTestMove.test_move_file_to_dircCs"t|j}|||j|jdSr)rrrrmrr)rzrcrrr"test_move_file_to_dir_pathlike_srcs z+TestMove.test_move_file_to_dir_pathlike_srccCs"t|j}||j||jdSr)rrrrmrrrzrdrrr"test_move_file_to_dir_pathlike_dsts z+TestMove.test_move_file_to_dir_pathlike_dstcCs |dSr)rorrrrtest_move_file_other_fssz TestMove.test_move_file_other_fscCs |dSr)rprrrrtest_move_file_to_dir_other_fssz'TestMove.test_move_file_to_dir_other_fsc Cs@tj|d}z||j||Wt|n t|0dSr)r\rrwrnrrryrzrrrr test_move_dirszTestMove.test_move_dircCs |dSr)rwrrrrtest_move_dir_other_fsszTestMove.test_move_dir_other_fsc Cs,||j|jtj|jtj|jdSr)rnrrr r,r-rrrrrtest_move_dir_to_dirs zTestMove.test_move_dir_to_dircCs |dSr)ryrrrrtest_move_dir_to_dir_other_fssz&TestMove.test_move_dir_to_dir_other_fsc Cs4||jtjj|jtj|jtj|jdSr)rnrr r,seprr-rrrrrtest_move_dir_sep_to_dirsz!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc Cs4||jtjj|jtj|jtj|jdSr)rnrr r,altseprr-rrrrrtest_move_dir_altsep_to_dirsz$TestMove.test_move_dir_altsep_to_dircCsHt|jdWdn1s"0Y|tjtj|j|jdS)Nr()r.rrrrrjrrrrrr"test_existing_file_inside_dest_dirsz+TestMove.test_existing_file_inside_dest_dircCs*tj|jd}|tjtj|j|dSNrK)r r,r-rrrrrjrrrrrtest_dont_move_dir_in_itselfsz%TestMove.test_dont_move_dir_in_itselfc CsrttzVdD]B\}}tjt|}tjt|}|jt||d||fdqWt tn t t0dS)N))srcdirz srcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)r) r rrr,r-rr _destinsrcrryrrrrtest_destinsrc_false_negatives   z&TestMove.test_destinsrc_false_negativec CsrttzVdD]B\}}tjt|}tjt|}|jt||d||fdqWt tn t t0dS)N))rzsrc/dest)rz srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)r) r rrr,r-rrrrryrrrrtest_destinsrc_false_positives   z&TestMove.test_destinsrc_false_positivecCs\tj|jd}t|j|t||j| tj |j| tj |j|jdSr) r r,r-rrrrrjrrrOsamefilerrrrrtest_move_file_symlinks zTestMove.test_move_file_symlinkcCsld}tj|j|}t|j|t||jtj|j|}| tj || tj |j|dSr) r r,r-rrrrrjrrrOr)rzrrdZ final_linkrrrtest_move_file_symlink_to_dirsz&TestMove.test_move_file_symlink_to_dircCsztj|jd}tj|jd}t||tj|jd}t|||tj || tj |tj |dSNrLrKrM) r r,r-rrrrrjrrOrrealpathrzrcrdr rrrtest_move_dangling_symlink%s  z#TestMove.test_move_dangling_symlinkcCs|tj|jd}tj|jd}t|t||tj|jd}t||| tj || tj ||dSr) r r,r-rrrrrrjrrOrrrrrtest_move_dir_symlink0s   zTestMove.test_move_dir_symlinkc Cs6t|j|j}||tj|jtj|jdSr) rrjrrrr r,r-rr=rrrtest_move_return_value<szTestMove.test_move_return_valuecCs6t|jtj|jd}||tj|jddSr)rrjrr r,r-rrr=rrr test_move_as_rename_return_valueAsz)TestMove.test_move_as_rename_return_valuecs8gfdd}tj|j|j|d|tddS)Ncs||fdSrrr6Zmovedrrr8Hsz7TestMove.test_move_file_special_function.._copyr*rj)rrjrrrrrzr8rrrtest_move_file_special_functionEs z(TestMove.test_move_file_special_functioncsdgfdd}ttj|jdttj|jdtj|j|j|d| t ddS)Ncs||fdSrrr6rrrr8Psz6TestMove.test_move_dir_special_function.._copychildZchild1r*r) rrr r,r-rrrjrrrrrrrtest_move_dir_special_functionMs  z'TestMove.test_move_dir_special_functionc Cs~||_tjtj|jtj|j}||j|z.t |j|| tj |Wt |n t |0dSr)rwrr r,r-rrupperrOrrjrrNrrvrrrtest_move_dir_caseinsensitiveWs  z&TestMove.test_move_dir_caseinsensitiverrr SF_IMMUTABLE UF_OPAQUErc Cs0ztttttj|ttj tt | t t vtttj ttjtdtttj|ttj tt | t t vWtjtrtttj tttjt rtt tj tt nNtjtrtttj tttjt r*tt tj tt 0dS)Nr)r r TESTFN_SRCrrrrr#rrj TESTFN_DSTrrMrrrr,r-rryrrrrtest_move_dir_permission_deniedhs,      z(TestMove.test_move_dir_permission_deniedN)+r|r}r~r;rmrnrorprqrsr'rtrurwrxryrzr|rrr r,r}r~rrrrrrrrrrrrrrrr[rrrrrrrrhsh              rhc@s`eZdZGdddeZddZeedddZ eeddd Z eedd d Z d S) TestCopyFilec@s:eZdZdZdZdZd ddZddZdd Zd d Z dS) zTestCopyFile.FauxFNTcCs||_||_dSr)_raise_in_exit_suppress_at_exit)rzZ raise_in_exitZsuppress_at_exitrrr__init__szTestCopyFile.Faux.__init__cGsdS)Nrr)rzrrrrrIszTestCopyFile.Faux.readcCs d|_dS)NT)_enteredrrrr __enter__szTestCopyFile.Faux.__enter__cCs&|||f|_|jr d|_td|jS)NT Cannot close) _exited_withr_raisedrr)rzexc_typeexc_valexc_tbrrr__exit__s  zTestCopyFile.Faux.__exit__)FT) r|r}r~rrrrrIrrrrrrFauxs rc Csrddd}ttd|F|ttddWdn1sF0YWdn1sd0YdS)NrHcSs|dkrtddsJdS)NsrcfilezCannot open "srcfile"rrmrrErrr_opensz4TestCopyFile.test_w_source_open_fails.._openr.rdestfile)rH)rrXrrrrrzrrrrtest_w_source_open_failss  z%TestCopyFile.test_w_source_open_failszskipped on macOScs|d fdd }ttd|tddWdn1sF0Y|j|jdtu| jdj d dS) NrHcs(|dkr S|dkrtdds$JdS)NrrCannot open "destfile"rrmrrrrrs z2TestCopyFile.test_w_dest_open_fails.._openr.rrrrj)r)rH) rrrXrrrrrrrrrrrrtest_w_dest_open_failss* z#TestCopyFile.test_w_dest_open_failscs||dd fdd }ttd|tddWdn1sR0Y|j|j|j|jdt u| jd j d dS) NTrHcs$|dkr S|dkrSds JdSNrrrrrrrrrrs z3TestCopyFile.test_w_dest_close_fails.._openr.rrrrj)r)rH) rrrXrrrrrrrrrrrrrtest_w_dest_close_failss *   z$TestCopyFile.test_w_dest_close_failsc s|d|d fdd }ttd|F|ttddWdn1s^0YWdn1s|0Y|j|j| j |j ddu|j dS) NTrHcs$|dkr S|dkrSds JdSrrrrrrrs z5TestCopyFile.test_w_source_close_fails.._openr.rrr)rH) rrrXrrrrrrrrrrrrrtest_w_source_close_failss  H   z&TestCopyFile.test_w_source_close_failsN) r|r}r~objectrrrrrrrrrrrrrs     rc@sxeZdZdZeddZeddZddZej dd Z d d Z d d Z ddZ ddZeejdkdddZdS)TestCopyFileObji cCstt|jdSr)rFrFILESIZEclsrrr setUpClassszTestCopyFileObj.setUpClasscCsttttdSr)rr`rr1rrrr tearDownClasss zTestCopyFileObj.tearDownClasscCsttdSrrr`r1rrrrtearDownszTestCopyFileObj.tearDownc csbttdD}ttd}||fVWdn1s60YWdn1sT0YdSNrGr(r.rr1rrrr get_filess  zTestCopyFileObj.get_filesc Cslt|dN}t|d$}|||Wdn1s@0YWdn1s^0YdSri)r.rrI)rzrcrdfsrcfdstrrrassert_files_eqs  zTestCopyFileObj.assert_files_eqcCsH| \}}t||Wdn1s.0Y|ttdSr)rr copyfileobjrrr1rrrr test_content s*zTestCopyFileObj.test_contentcCsP|4\}}t|||jr$J|jr.JWdn1sB0YdSr)rrrclosedrrrrtest_file_not_closed s  z$TestCopyFileObj.test_file_not_closedcCs`|D\}}t|||||j|||jWdn1sR0YdSr)rrrrtellrrrrrtest_file_offset s z TestCopyFileObj.test_file_offsetrz Windows onlycCstjd}tttWdn1s.0Y|jsBJ||j dddt j t dd}|dWdn1s0Y|j}|tj|tjd}t|tWdn1s0Y||j dddt j t dd}Wdn1s 0Y|j}|tj|tjd}t|tWdn1sn0Y|jrJ||tdS) Nzshutil._copyfileobj_readintorrZiFrWsfoor)rrHrIrrrr1calledr call_argsr\r]r r^r/rSrxrr`r)rzmrErtrrr test_win_impl s&* (* , zTestCopyFileObj.test_win_implN)r|r}r~r classmethodrrr contextlibcontextmanagerrrrrrrrr rSrrrrrrs   rc@seZdZdZdZdZdZeddZeddZ d d Z e j d d Z d dZddZddZddZddZddZddZddZddZdS) _ZeroCopyFileTestz#Tests common to all zero-copy APIs.ir6rcCsXtt|jttd.}||_t|j|jks6JWdn1sJ0YdSri)rFrrr.rIFILEDATAr)rrErrrr7 s   z_ZeroCopyFileTest.setUpClasscCsttdSr)rr`rrrrrr> sz_ZeroCopyFileTest.tearDownClasscCsttdSrrrrrrrB sz_ZeroCopyFileTest.tearDownc csbttdD}ttd}||fVWdn1s60YWdn1sT0YdSrrrrrrrE s  z_ZeroCopyFileTest.get_filescOs tddS)Nzmust be implemented in subclass)NotImplementedError)rzrrrrr zerocopy_funK sz_ZeroCopyFileTest.zerocopy_funcCs$||||dSr)rrrr;rrrrresetN sz_ZeroCopyFileTest.resetc Cs| \}}|||Wdn1s.0Y|ttdd|j|V\}}tjd}t t tWdn1s0Y|j rJWdn1s0YdS)NTr0zshutil.copyfileobj) rrrrJr1rrrHrIrrrr)rzrcrdrrrrtest_regular_copyV s**z#_ZeroCopyFileTest.test_regular_copyc Cs||j|J\}}|t|||Wdn1sF0YWdn1sd0Y|ttdd|j dS)NTr) rxrrrrrrrJrrrrrrtest_same_file` s   Hz _ZeroCopyFileTest.test_same_filecCsZtjtd}|t}t|dWdn1s<0Y||j j |dS)Nrnew) r\rr r^rrrrrrr)rzrSrrrrtest_non_existent_srch s *z'_ZeroCopyFileTest.test_non_existent_srcc stdtd|fdd|fddtdWdn1sT0YtdF}td}|||Wdn1s0YWdn1s0Y|tdd d dS) Nrcrdcs tSrrr`r)rarrrq r6z3_ZeroCopyFileTest.test_empty_file..cs tSrrr)rbrrrr r6r(rGTrr6)rrxr.rrrJrr)rbrartest_empty_filen s   Hz!_ZeroCopyFileTest.test_empty_filecCsHtjj|jtd"|ttjtt Wdn1s:0YdS)Nr$) rrHrI PATCHPOINTZeroDivisionErrorrrrrr1rrrrtest_unhandled_exception| s  z*_ZeroCopyFileTest.test_unhandled_exceptionc Cstjj|jttjddr|J\}}|t | ||Wdn1sV0YWdn1st0YWdn1s0YdSNyor) rrHrIrrrEINVALrrr rrrrrtest_exception_on_first_call s    z._ZeroCopyFileTest.test_exception_on_first_callc Cs|tjj|jttjddN|&\}}|t|j ||Wdn1sP0YWdn1sn0YdSr) rrHrIrrrENOSPCrrrrrrrtest_filesystem_full s   z&_ZeroCopyFileTest.test_filesystem_fullN)r|r}r~__doc__rrrrrrrrrrrrrrrrrrrrrrrr1 s(     rzos.sendfile() not supportedc@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS)TestZeroCopySendfile os.sendfilecCs t||Sr)r_fastcopy_sendfile)rzrrrrrr sz!TestZeroCopySendfile.zerocopy_func Cst|j|}ttdR}|t|||Wdn1sF0Yt ||Wdn1sp0YWdn1s0Y| t tdd|jdS)Nr(Tr) ioBytesIOrr.r1rr rrrrrJrrrrtest_non_regular_file_src s   *Hz.TestZeroCopySendfile.test_non_regular_file_srcc Csttd}tn}|t|||Wdn1sB0Yt||| d| | |j Wdn1s0YWdn1s0YdS)NrGr) r.rrrrr rrrseekrrIrrrrrtest_non_regular_file_dst s   *  z.TestZeroCopySendfile.test_non_regular_file_dstc sfdd}gtjtjjdd|dr|J\}}|t}t ||Wdn1sf0YWdn1s0YWdn1s0YsJ| |j j t j dS)Ncs,sd|i|SttjddS)Nr)rPrrEBADFrr(Z orig_sendfilerrrV s zDTestZeroCopySendfile.test_exception_on_second_call..sendfilerT)rVr$)r rVrrHrIrrrrrrrrr)rzrVrcrdrrrrtest_exception_on_second_call s  fz2TestZeroCopySendfile.test_exception_on_second_callc CstjjdtdR}|*\}}t|||js6JWdn1sJ0YWdn1sh0Y|t t dd|j dS)Nos.fstatrTr) rrHrIrrrrrrrJr1rrzrrcrdrrrtest_cant_get_size s  Fz'TestZeroCopySendfile.test_cant_get_sizec Cstj}d|_tjjd|dR}|*\}}t|||jsFJWdn1sZ0YWdn1sx0Y| t t dd|j dS)NirrUTr) rrHMockst_sizerIrrrrrrJr1rrzrHrrcrdrrrtest_small_chunks s  Fz&TestZeroCopySendfile.test_small_chunksc Cstj}|jd|_tjjd|dR}|*\}}t|||j sLJWdn1s`0YWdn1s~0Y| t t dd|j dS)Ni@rrTr)rrHrrrrIrrrrrrJr1rrrrrtest_big_chunk s   Fz#TestZeroCopySendfile.test_big_chunkcCstjjdtd}|ttjtt|j dd}| |t j tttttddd|tjtd|ttjttd|j dd}| |d Wdn1s0YdS) NrrrrshelloTr3i)rrHrIrrrrrr1rrr r,rArr`r2rx)rzr blocksizerrrtest_blocksize_arg s"  z'TestZeroCopySendfile.test_blocksize_argc Cstjs Jztjj|jttjdd|}| J\}}| t t ||Wdn1sb0YWdn1s0Y|j sJWdn1s0YtjrJtj|j&}ttt|j rJWdn1s0YWdt_ndt_0dS)NrrT)r_USE_CP_SENDFILErrHrIrrrENOTSOCKrrr rrrrr1rrrrtest_file2file_not_supported s    H(  *z1TestZeroCopySendfile.test_file2file_not_supportedN) r|r}r~rrrrrrrrrrrrrrr s     rz macOS onlyc@seZdZdZddZdS)TestZeroCopyMACOSzposix._fcopyfilecCst||tjSr)r_fastcopy_fcopyfileposix_COPYFILE_DATArrrrr szTestZeroCopyMACOS.zerocopy_funN)r|r}r~rrrrrrr src@s^eZdZddZddZddZee e j dee edd d d Zd d ZdS)TestGetTerminalSizecCs(t}||jd||jddS)zCheck if get_terminal_size() returns a meaningful value. There's no easy portable way to actually check the size of the terminal, so let's check if it returns something sensible instead. rN)rget_terminal_sizer!columnslines)rzrBrrrtest_does_not_crash sz'TestGetTerminalSize.test_does_not_crashcCst&}d|d<|d=t}Wdn1s40Y||jdt&}|d=d|d<t}Wdn1s0Y||jddS)z.Check if environment variables have precedenceZ777COLUMNSLINESNi Z888ix)rrOrr rr r rzrQrBrrrtest_os_environ_first s & &z)TestGetTerminalSize.test_os_environ_firstcCs`t(}d|d<d|d<t}Wdn1s60Y||jd||jddS)NrgrZyyyrr)rrOrr r!r r rrrrtest_bad_environ. s  &z$TestGetTerminalSize.test_bad_environz not on ttyr zneed os.get_terminal_size()c Csztddg}Wn$tttjfy>|dYn0t|dt|df}t $}|d=|d=t }Wdn1s0Y| ||dS) zCheck if stty returns the same results ignoring env This test will fail if stdin and stdout are connected to different terminals with different sizes. Nevertheless, such situations should be pretty rare. ZsttyrBzstty invocation failedrjrrrN)rorrrrrr#rr0rsrrOrr r)rzrBr rQrrrrtest_stty_match6 s   &z#TestGetTerminalSize.test_stty_matchc Cst}|d=|d=ttddtjdd}Wdn1sF0Y||jd||jdt t j dJ}ttd|tjd d}Wdn1s0YWdn1s0Y||jd ||jd Wdn1s0YdS) Nrr __stdout__) )fallbackrrr))(rr) rrOrXrmrr rr r r.r devnull)rzrQrBrErrr test_fallbackN s * Hz!TestGetTerminalSize.test_fallbackN)r|r}r~r rrrrr isattyrmrr_r[rrrrrrr  s   r c@seZdZdZddZdS)PublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsP|ttdgd}ttds,tjdkr6|d|ttjt|dS)N__all__)rrrPr]rrrrjryrr ExecErrorrrrrr rr rrr$rr r statvfsrr) rr[rr rSrPrrr)rzZ target_apirrrtest_module_all_attributee s  z(PublicAPITests.test_module_all_attributeN)r|r}r~rr!rrrrrb sr__main__)F)F)PrZ unittest.mockrr\rmrr Zos.pathrr%rror7r9rrrrrrrrrr r r r r rrr ImportErrorrrZ test.supportrrrr1rrrrrrrlrrrrrr'r2rFrJrQrgZSUPPORTS_SENDFILErtruZTestCaserrrJrrr1rgrhrrrrrrrr rr|mainrrrrs8                [tP< s\Jd v N