ÿØÿà 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  r2cCsrdd}t|d}dddt|D}t|d*}|||D]}||q@Wdn1sd0YdS) zBCreate a test file with an arbitrary size and random text content.css&||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,sizer5bufsizechunkfZcsizerrrwrite_test_fileQs   *rEcCsTt|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  rIcCs|g}tt|D]d}tj||}tj|rltj|sl||dt|D]}||d|qRq||q|S)N/) sortedr listdirr,r-isdirislinkappendrlistdir)r,resnamepnrrrrPos  rPc 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 0123456789rFrT) hasattrr tempfileNamedTemporaryFilegetcwdrRr/r.filenorUrrunlink)srcnamedstnamerDsrcdstinfdoutfdrrrsupports_file2file_sendfile{sH (      F      rfcCsJtrBtjdkrBtdtj}|ddd}t|ddkSdSdS) Niz/usr/bin/dump -o %s i T)AIXsysmaxsize subprocess getoutput executablesplitint)ZhdrsZmaxdatarrr _maxdataOKs rsc@seZdZdddZdS)BaseTestNcCs$tj|td}|tj||S)zjCreate a temporary directory that will be cleaned up. Returns the path of the directory. )prefixrW)r[mkdtempr r] addCleanuprrmtree)selfrudrrrrvszBaseTest.mkdtemp)N)__name__ __module__ __qualname__rvrrrrrtsrtc@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) rvr r,r-mkdirr2fsencodeassertIsInstancebytesshutilrx)rytmpZvictimrrrtest_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) NrWlinkcs|dSrrOrerrorsrronerrorsz8TestRmTree.test_rmtree_fails_on_symlink..onerrorrrirrY)rvr r,r-rsymlink assertRaisesrrrx assertTrueexistslexists assertEquallenassertIsrNrryrZdir_rrrrrtest_rmtree_fails_on_symlinks   z'TestRmTree.test_rmtree_fails_on_symlinkc Cs|}tj|d}tj|d}tj|d}|||fD]}t|q.onerrorrrirrY)rvr r,r-r_winapiCreateJunctionrwrr_rrrrxrrrrrrrNrrrrrtest_rmtree_fails_on_junctionss    z)TestRmTree.test_rmtree_fails_on_junctionsc Cs|}tj|d}tj|d}tj|d}|||fD]}t|q.onerrorrrYrri)r[mktemprvrFileNotFoundErrorrrxr2r r,r-NotADirectoryErrorassertIn exceptionfilenamerrrrrscandirrrmdir)ryrtmpdircmZ 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 rrrwrrxr,r-child_file_pathchild_dir_pathrcreate_empty_filestatst_modeS_IREADS_IEXECchmodcheck_args_to_onerrorr)ryZ 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)NrYrrir)rr r_rrrrrrLrrr issubclassr)ryr#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 lstatrrr2rrx)ryrrrr+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_fdrL supports_fdsupports_follow_symlinksrr_use_fd_functionsrxavoids_symlink_attacksrvr,r-r_rmtree_safe_fd Exceptionrr)ryrtmp_dirrzZ 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[mkstemprvr closerrrrxremove)ryhandler,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-rrrrrxryrbrcrrrtest_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.rrrrrrrxrrrrtest_rmtree_on_junctions   z"TestRmTree.test_rmtree_on_junction)r{r|r}rrskip_unless_symlinkrrunittest skipUnlessrrrrskipIfrlplatformrZr rrrrrrrrrrrrr~s2       $  r~c@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)rvr r,r-rwrrxdirnamer2rcopytreerisfilerMrIrrysrc_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)rvrwrrxr2r rr,r-rrrrMrIrrFileExistsErrorrrrrtest_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)Nrbrcsubzfile.txtrrzsub/linklchmodlchflags UF_NODUMPTsymlinksntz\\?\)rvr r,r-rr2rrZrrS_IRWXUS_IRWXOrrrrrrrNreadlinkrR startswithrrst_flags) ryrrrZsub_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)Nrhr z.py)r r,r-rMrqrOsplitext)rbnamesrQrRr,rrr_filter1s   z8TestCopyTree.test_copytree_with_exclude.._filter)r r,r-rrvr2rrignore_patternsrrrrxr)ryr-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) Nsourcerr rrcsT||t|tt|tt||D]}|tq>gSr)rOrstrlistrrset)rbrrRZ invokationsryrr_ignoreXs   z?TestCopyTree.test_copytree_arg_types_of_ignore.._ignorerrr )r r,r-rrvrr2rrrpathlibPathrrrDirEntryrr)ryr-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.txtrirri)rvr r,r-rrwrrxrr2r[rrrrrrq)ryrrrZrestrictive_subdirZrestrictive_subdir_dstrrr!test_copytree_retains_permissionsts6      z.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs|}tj|d}|tj||tjtj|td|_ | tj t ||Wdn1sv0YdS)Nrzka-boom) rvr r,r-rwrrxrPermissionError side_effectrrr)ryZ mock_patchrrrrrtest_copytree_winerrors z#TestCopyTree.test_copytree_winerrorcsfdd}gtjdttjdd}|Wdn1s`0Ytj |d t ddS)NcsRd|t|t|tjd|tjddSNr)rOrrrr r,r-)rrrcflagryrbrr custom_cpfuns    zETestCopyTree.test_copytree_custom_copy_function..custom_cpfunrrr) copy_functionri) rvr[rr.r r,r-rrrrr)ryr(rDrr&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) Nr Zmypipeos.mkfifo(): %srriz`%s` is a named pipez$shutil.Error should have been raisedTr)r rrr,r-r,r"skipTestrrTESTFN2rrrrfailrx)ryr pipeerrbrcZ error_msgrrrtest_copytree_named_pipes*  $ & z%TestCopyTree.test_copytree_named_pipecs|}tj|d}t|dfdttj|dt|ddfdgfdd}tj|||d|t d dS) Nrrrrrcs||fdSrrrbrcZcopiedrr_copysz6TestCopyTree.test_copytree_special_func.._copyr)rY) rvr r,r-r2rrrrr)ryrrr7rr6rtest_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)rvr r,r-rrr2rrrr assertNotInrLrryrrrrrtest_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_directoryFrr9)rvr r,r-rr.rrrrrNrrLrr<rrrtest_copytree_symlink_dirs  z&TestCopyTree.test_copytree_symlink_dircCs\|}|d}|tj|dtj|d}t|dt||}| dgt |dS)NdestTr) rvrwrrxr r,r-r2rrrL)ryrrrbrvrrrtest_copytree_return_values  z'TestCopyTree.test_copytree_return_valuecCs|}|jtj|ddtj|dd}tj|dd}t|tj|d}t|dt ||}| dgt |dS)NTrtZpgZ somevendorz1.0Zpol) rvrwrrxr r,r-makedirsr2rrrL)rybase_dirrrrbrArrrtest_copytree_subdirectorys   z'TestCopyTree.test_copytree_subdirectoryN)r{r|r}rrrrr rr r!rmockpatchr$r+rrZr r4r8r=r?rBrFrrrrrs( 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)rvr r,r-r2rrrrS_IRWXGrassertNotEqualrrcopymoderrRryrrbrcrr 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|jdSNrrJrKrLFfollow_symlinks)rvr r,r-r2rrrrrMrrrrOrrrrNrPrrr 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||dddSrR)rvr r,r-r2rrrOrPrrr*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)NrrJrKquxgE@rrrTrSFst_atimest_mtimerirg?)rvr r,r-r2rutimerYrZrNrrZrrrrrrcopystatrrassertLessEqualrrrrabs) ryrrbrcrr 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)NTrScs_dSr)r)r,flagsrTerrexrr_chflags_raiserszlTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser.._chflags_raiserr)rirkrrhrmake_chflags_raiserszSTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser) rvr r,r-r2rbrrcrdrr\rr)ryrrrermZ old_chflagsrirrr-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)NrrJuser.foo42zuser.bar43EPERMcs&|dkrn|||fi|dS)Nror)fnamer`valr) orig_setxattros_errorrr_raise_on_user_foosz3TestCopy.test_copyxattr.._raise_on_user_fooTrScs |krttjd||dS)NzOperation not supportedrS)rrrd)rsrT)orig_listxattrrbrr _raise_on_srcs z.TestCopy.test_copyxattr.._raise_on_srcZ the_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZ the_copy_ro)rvr r,r-r2r _copyxattrsetxattrrrK listxattrgetxattrrrrrrrrr\)ryrrcrwryZsrcroZdstror)rxrurvrbrtest_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) NrrKz trusted.foorprqFrSrJrW) rvr r,r-r2rr{rrzrr}rr)ryrrbrrcr rrrtest_copyxattr_symlinkss     z TestCopy.test_copyxattr_symlinkscCsPd}|}t||fdtj||}|}|||tj||}||fS)Nrrf)rvr2r r,r-)rymethodrsrrtmpdir2rerrr _copy_file s zTestCopy._copy_filecCsB|tj\}}|tj||t|j t|j dSr) rrcopyrr r,rrrr)ryrrerrr 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)NrrJrKrTrSF)rvr r,r-r2rrZrrrrrrrrNrrIrrrrr)ryrrbrcrrrrtest_copy_symlinkss&      zTestCopy.test_copy_symlinksr[zrequires os.utimecCs|tj\}}|tj|t|}t|}||j |j dD] }| t ||t ||dqJt tdrt |dr|t |dt |ddS)NrXrirbr) rrcopy2rr r,rrrrr]rrZ)ryrreZ file1_statZ file2_statr`rrr 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) NrrJrKrrrTrSFrXrir)rvr r,r-r2rrZrrrrrrrrrrrNrrIrrrr[rr]rrrNr) ryrrbrcrr r_r r`rrrtest_copy2_symlinksCs<          zTestCopy.test_copy2_symlinkscCsr|}tj|d}tj|d}t|dt|ddt|||t |dt |dt |dS)NrrJrorp) rvr r,r-r2r{rrrr}r)ryrrbrcrrrtest_copy2_xattrfs    zTestCopy.test_copy2_xattrcCstjtjfD]v}|}|}tj|d}t|d|||}||tj|d||tj|d}||tj|dq dS)NrrJ) rrrrvr r,r-r2r)ryrrrrbrArrrtest_copy_return_valuess  zTestCopy.test_copy_return_valuecCs|tjdSr)_test_copy_dirrrryrrr test_copy_dirszTestCopy.test_copy_dircCs|tjdSr)rrrrrrrtest_copy2_dirszTestCopy.test_copy2_dircCsx|}tj|d}|}tj|d}t|dtjdkrFt}nt}| ||||| |||||||dSNrdoes_not_exist/win32) rvr r,r-r2rlrr"IsADirectoryErrorr)ryZ copy_funcrsrc_filerrcrirrrrs  zTestCopy._test_copy_dircCs|}tj|d}tj|d}tj|d}tj|d}t|dt||tj||dd|tj || t |t |t||| tj |dS)Nrbrcr rrFrS) rvr r,r-r2rrcopyfilerrNrrr)ryrrbrcr 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(): %srGTr)r rrr,r-r.r/rr"r/rrr rrrHrrx)ryrbrcrDr3rrr'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)rrGTr)r rrr,r-r.r/rrrr rrrHrrx)ryrbrcrDrrr*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"r/rrSpecialFileErrorrr0__file__r)ryr3rrrtest_copyfile_named_pipes$z!TestCopy.test_copyfile_named_pipecCsl|}|}tj|d}tj|d}t|dt||}|tj|| t |t |dS)NrJr) rvr r,r-r2rrrrrrI)ryrrdst_filerrArrrtest_copyfile_return_values  z#TestCopy.test_copyfile_return_valuecCsX|}tj|d}t|d|ttj|||t tj||| t |ddSr%) rvr r,r-r2rr rrrrrI)ryrrrrrtest_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) rvr r,r-r2rrrr)ryrrrcrrrtest_copyfile_nonexistent_dirs  z&TestCopy.test_copyfile_nonexistent_dircCs|}tj|d}|}tj|d}t|dtjdkrFt}nt}| |t j ||| |t j ||| |t j ||dSr) rvr r,r-r2rlrr"rrrr)ryrrrrcrirrrtest_copyfile_copy_dirs  zTestCopy.test_copyfile_copy_dirN))r{r|r}rrrQrrrZr rUrrVrarrnZskip_unless_xattrr~rrrrrrrrrrrrrrrrrrMACOSSOLARISrrrrrrrrIsh    (  ?    "         rIc@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.tarrG) _create_filesrvr rr,rr-basenamer change_cwdabspathrrrrtarfileZ is_tarfiler.assertCountEqualgetnames) ryroot_dirrErwork_dir rel_base_name base_nametarballZtfrrrtest_make_tarballs0    , " . zTestArchives.test_make_tarballcCsFt|(}|}|t|WdS1s80YdSr)rr.rsortr+)ryr,rrrrr_tarinfo:s zTestArchives._tarinfodistcCs|}tj||}tj|ddt|dfdt|dfdttj|dt|ddfdttj|d|rt|d fd||fS) NT)exist_okrrfrerZfile3Zsub2outer)rvr r,r-rDr2r)ryrErrrrrr@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-rvrrrrrn check_callDEVNULLr)ryrrErrZtarball2Ztar_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)rrvr rr,rr-rrrrrrrrzipfile is_zipfileZipFilernamelist) ryrrErrrrrQzfrrrtest_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-rvrrrrrnrrrrrrK) ryrrErrZarchive2zip_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-rvrrrrrrrn check_outputSTDOUTCalledProcessErroroutputdecoder/r1format) ryrrErrrrZdetailsmsgrrrtest_unzip_zipfiles    zTestArchives.test_unzip_zipfilecCs*|}tj|d}|tt|ddS)Nrrf)rvr r,r-r ValueErrorr)ryrrrrrtest_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-rvrrr)ryrrrrErrQrrrtest_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-rvrrrrrrrrrrr.Z getmembersruidgidr) ryrrErrr 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.._breaksrfxxx file)r)r r]rrrvrrr)ryZ current_dirrrrrtest_make_archive_cwds z"TestArchives.test_make_archive_cwdcCsZ|}t|4|tddd|tjdWdn1sL0YdS)Ntestrztest.tar rvrrrrrr r,rryrrrrtest_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) NrfricSstSrxrrrrr6z;TestArchives.test_register_archive_format..cSstSrrrrrrr!r6)rirY)rirYrcSstSrrrrrrr$r6rcSsg|] \}}|qSrrr<rRparamsrrrr>%r6z=TestArchives.test_register_archive_format..cSsg|] \}}|qSrrrrrrr>)r6)r TypeErrorrrrrr;)ryformatsrrrtest_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)ryrrrrrcheck_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)Nrrrrf)rrPrr r,r-rvrrrrr ReadErrorrr) ryr converterrrrEexpectedrrrZtmpdir3rrrr5s"  2 z0TestArchives.check_unpack_archive_with_convertercCsT|j|dd|j|ddt|||Wdn1sF0YdS)NZ fully_trustedfilterdata)rrZcheck_no_warnings)ryrrrrcheck_unpack_tarballMs z!TestArchives.check_unpack_tarballcCs|ddS)Nrr rrrrtest_unpack_archive_tarSsz$TestArchives.test_unpack_archive_tarcCs|ddS)Nrr rrrrtest_unpack_archive_gztarVsz&TestArchives.test_unpack_archive_gztarcCs|ddS)Nbztarr rrrrtest_unpack_archive_bztarZsz&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCs|ddS)Nxztarr rrrrtest_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)Nri stuff.booxx)r)r extract_dirextrarrr_booms  z/TestArchives.test_unpack_registry.._booZBooz.booz.b2)rrirrZBoo2r) r rrrr r rr;r)ryrrrrrtest_unpack_registryis   z!TestArchives.test_unpack_registryN)r)&r{r|r}rZ requires_zlibrrrrrrwhichrrrrrrrrrrrrrrr rrZ requires_bz2rZ requires_lzmarrkrsrrrrrrrrs\ #    $            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,rrrrrrZ assertGreaterr3rassertGreaterEqualr)ryusager`rrrtest_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,rrsrryrr check_chowns  z(TestMisc.test_chown..check_chown)rr)NN)rvr[rr2rrrr# LookupErrorrr getuidgetgidrrrrKeyError)ryrrrr*r$rrr)r test_chownsR   ( , , * ,           zTestMisc.test_chownN) r{r|r}rrrZrr"rr r/rrrrrs  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)ruz.ExerWrusuffixz.EXE)rvtemp_dirr[r\ temp_filer rrRrS_IXUSRrwrr,rqrWfileenv_pathcurdirextrrrrsetUpszTestWhich.setUpcCs&tj|j|jd}|||jjdSNr)rrr6rWrr4rRryrArrr test_basicszTestWhich.test_basiccCs(tj|jj|jd}|||jjdSr;)rrr4rRr3rr<rrrtest_absolute_cmdszTestWhich.test_absolute_cmdcCstj|j\}}tj||j}tj|d,tj ||j d}| ||Wdn1s`0Ytj|jd(tj ||d}| |Wdn1s0YdSr;) r r,rqrWr-r6rrrrr3r assertIsNone)ryrEtail_dirrelpathrArrrtest_relative_cmds*zTestWhich.test_relative_cmdcCstj|j}tj|jdPtj|j|d}t j dkrT| |tj |j |jn ||Wdn1sr0YdS)Nrr)r r,rrWrrrrr6rlrrr-r8r?)ryrErArrrtest_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 rr4rRrraccessW_OKr/rrr6rWr?r<rrrtest_non_matching_modes  z TestWhich.test_non_matching_modecCsjtj|j\}}tj|d8tj|j|d}| |tj ||jWdn1s\0YdSr;) r r,rqrWrrrrr6rr-)ryrEr@rArrrtest_relative_pathszTestWhich.test_relative_pathcCstjd|jd}||dS)Nzfoo.exer)rrrWr?r<rrrtest_nonexistent_fileszTestWhich.test_nonexistent_filerzpathext check is Windows-onlycCs<tj|jdd|jd}|||jjdd|jdS)Nr)rrr6rWrr4rRr9r<rrrtest_pathext_checkingszTestWhich.test_pathext_checkingcCsRt6}|j|d<t|j}|||jjWdn1sD0YdSNPATH) rEnvironmentVarGuardr7rrr6rr4rRryenvrArrrtest_environ_path%s   zTestWhich.test_environ_pathc Cst}d|d<tjjd|jddttd|jRt|j&t |j }| |Wdn1sr0YWdn1s0YWdn1s0YWdn1s0YdS)NrrM os.confstrT return_valuecreatedefpath) rrNrrGrHrW swap_attrr rrrr6r?rOrrrtest_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)NrrMrRTrSrV)r r,rr4rRrlrr8r*rrr-rrNpathseprrGrHrWrWrrr6r?rr)ryZ expected_cwdr8rPrArrrtest_environ_path_cwd6s$         zTestWhich.test_environ_path_cwdc Cs8t}|ddtjjdtddLttd|j t |j }Wdn1s^0YWdn1s|0Y| ||jjtjjd|j ddJttddt |j }Wdn1s0YWdn1s0Y| ||jjWdn1s*0YdS)NrMrRT)r#rUrVrSr)rrNpoprrGrHrrWr rWrrr6rr4rRrOrrrtest_environ_path_missingLs    H  Hz#TestWhich.test_environ_path_missingc Cstj|j}tj|jd\t4}|j|d<tj |j dd}| |Wdn1s`0YWdn1s~0YdS)NrrMr) r r,rrWrrrNr7rrr6r?)ryrErPrArrrtest_empty_path^s zTestWhich.test_empty_pathcCsNt2}|ddt|j}||Wdn1s@0YdSrL)rrNr[rrr6r?rOrrrtest_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.xyzTmp2r1rPATHEXTr)r[r\r3r rrRrr5rwrr,rrrrNrrrryr9Z temp_filexyzZprogramrPrArrr test_pathextls  zTestWhich.test_pathextcCsd}tj|jd|d}||jtj|j}tj |d}t <}|d|d<t j ||jd}|||jWdn1s0YdS)Nr_r`r1r;rar)r[r\r3rwrr r,rrRrrrNrrrrbrrrtest_pathext_with_empty_str~s  z%TestWhich.test_pathext_with_empty_strN)r{r|r}r:r=r>rBrCrrrZr rrGrHrIrrlrrKrQrXrZr\r]r^rcrerrrrr0s2       r0c@seZdZddZdS)TestWhichBytescCsXt|t|j|_t|j|_t|jj|j_t|j|_t|j |_ dSr) r0r:r rrWr6r4rRr8r9rrrrr:s  zTestWhichBytes.setUpN)r{r|r}r:rrrrrfsrfc@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%) rvrrr r,r-rrr.r/)ryrrDrrrr:s  zTestMove.setUpcCst|d}|}Wdn1s(0Yt||t|d }|||Wdn1sn0Y|tj|dSNrF) r.rHrmoverrr r,r)ryrbrcreal_dstrDcontentsrrr_check_move_files  &  .zTestMove._check_move_filecCsFtt|}t||||tt||tj|dSr) rKr rLrrirrr,r)ryrbrcrjrkrrr_check_move_dirs zTestMove._check_move_dircCs||j|j|jdSr)rlrrrrrrtest_move_fileszTestMove.test_move_filecCs||j|j|jdSr)rlrrrrrrrtest_move_file_to_dirszTestMove.test_move_file_to_dircCs"t|j}|||j|jdSr)rrrrlrr)ryrbrrr"test_move_file_to_dir_pathlike_srcs z+TestMove.test_move_file_to_dir_pathlike_srccCs"t|j}||j||jdSr)rrrrlrrryrcrrr"test_move_file_to_dir_pathlike_dsts z+TestMove.test_move_file_to_dir_pathlike_dstcCs |dSr)rnrrrrtest_move_file_other_fssz TestMove.test_move_file_other_fscCs |dSr)rorrrrtest_move_file_to_dir_other_fssz'TestMove.test_move_file_to_dir_other_fsc Cs@tj|d}z||j||Wt|n t|0dSr)r[rrvrmrrrxryrrrr test_move_dirszTestMove.test_move_dircCs |dSr)rvrrrrtest_move_dir_other_fsszTestMove.test_move_dir_other_fsc Cs,||j|jtj|jtj|jdSr)rmrrr r,r-rrrrrtest_move_dir_to_dirs zTestMove.test_move_dir_to_dircCs |dSr)rxrrrrtest_move_dir_to_dir_other_fssz&TestMove.test_move_dir_to_dir_other_fsc Cs4||jtjj|jtj|jtj|jdSr)rmrr r,seprr-rrrrrtest_move_dir_sep_to_dirsz!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc Cs4||jtjj|jtj|jtj|jdSr)rmrr r,altseprr-rrrrrtest_move_dir_altsep_to_dirsz$TestMove.test_move_dir_altsep_to_dircCsHt|jdWdn1s"0Y|tjtj|j|jdS)Nr()r.rrrrrirrrrrr"test_existing_file_inside_dest_dirsz+TestMove.test_existing_file_inside_dest_dircCs*tj|jd}|tjtj|j|dSNrJ)r r,r-rrrrrirqrrrtest_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 _destinsrcrrxrrrrtest_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-rrrrrxrrrrtest_destinsrc_false_positives   z&TestMove.test_destinsrc_false_positivecCs\tj|jd}t|j|t||j| tj |j| tj |j|jdSr) r r,r-rrrrrirrrNsamefilerqrrrtest_move_file_symlinks zTestMove.test_move_file_symlinkcCsld}tj|j|}t|j|t||jtj|j|}| tj || tj |j|dSr) r r,r-rrrrrirrrNr)ryrrcZ final_linkrrrtest_move_file_symlink_to_dirsz&TestMove.test_move_file_symlink_to_dircCsztj|jd}tj|jd}t||tj|jd}t|||tj || tj |tj |dSNrKrJrL) r r,r-rrrrrirrNrrealpathryrbrcr 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-rrrrrrirrNrrrrrtest_move_dir_symlink0s   zTestMove.test_move_dir_symlinkc Cs6t|j|j}||tj|jtj|jdSr) rrirrrr r,r-rr<rrrtest_move_return_value<szTestMove.test_move_return_valuecCs6t|jtj|jd}||tj|jddSr)rrirr r,r-rrr<rrr test_move_as_rename_return_valueAsz)TestMove.test_move_as_rename_return_valuecs8gfdd}tj|j|j|d|tddS)Ncs||fdSrrr5Zmovedrrr7Hsz7TestMove.test_move_file_special_function.._copyr)ri)rrirrrrryr7rrrtest_move_file_special_functionEs z(TestMove.test_move_file_special_functioncsdgfdd}ttj|jdttj|jdtj|j|j|d| t ddS)Ncs||fdSrrr5rrrr7Psz6TestMove.test_move_dir_special_function.._copychildZchild1r)r) rrr r,r-rrrirrrrrrrtest_move_dir_special_functionMs  z'TestMove.test_move_dir_special_functionc Cs~||_tjtj|jtj|j}||j|z.t |j|| tj |Wt |n t |0dSr)rvrr r,r-rrupperrNrrirrMrrurrrtest_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"rri TESTFN_DSTrrLrrrr,r-rrxrrrrtest_move_dir_permission_deniedhs,      z(TestMove.test_move_dir_permission_deniedN)+r{r|r}r:rlrmrnrorprrr'rsrtrvrwrxryr{rrr r,r|r}r~rrrrrrrrrrrrrrrZrrrrrrrrgsh              rgc@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)ryZ raise_in_exitZsuppress_at_exitrrr__init__szTestCopyFile.Faux.__init__cGsdS)Nrr)ryrrrrrHszTestCopyFile.Faux.readcCs d|_dS)NT)_enteredrrrr __enter__szTestCopyFile.Faux.__enter__cCs&|||f|_|jr d|_td|jS)NT Cannot close) _exited_withr_raisedrr)ryexc_typeexc_valexc_tbrrr__exit__s  zTestCopyFile.Faux.__exit__)FT) r{r|r}rrrrrHrrrrrrFauxs rc Csrddd}ttd|F|ttddWdn1sF0YWdn1sd0YdS)NrGcSs|dkrtddS)NsrcfilezCannot open "srcfile"rlrrDrrr_opensz4TestCopyFile.test_w_source_open_fails.._openr.rdestfile)rG)rrWrrrrryrrrrtest_w_source_open_failss  z%TestCopyFile.test_w_source_open_failszskipped on macOScs|d fdd }ttd|tddWdn1sF0Y|j|jdtu| jdj d dS) NrGcs |dkr S|dkrtddS)NrrCannot open "destfile"rlrrrrrs z2TestCopyFile.test_w_dest_open_fails.._openr.rrrri)r)rG) rrrWrrrrrrrrrrrrtest_w_dest_open_failss* z#TestCopyFile.test_w_dest_open_failscs||dd fdd }ttd|tddWdn1sR0Y|j|j|j|jdt u| jd j d dS) NTrGcs|dkr S|dkrSdSNrrrrrrrrrs z3TestCopyFile.test_w_dest_close_fails.._openr.rrrri)r)rG) rrrWrrrrrrrrrrrrrtest_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) NTrGcs|dkr S|dkrSdSrrrrrrrs z5TestCopyFile.test_w_source_close_fails.._openr.rrr)rG) rrrWrrrrrrrrrrrrrtest_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)rErFILESIZEclsrrr setUpClassszTestCopyFileObj.setUpClasscCsttttdSr)rr_rr0rrrr tearDownClasss zTestCopyFileObj.tearDownClasscCsttdSrrr_r0rrrrtearDownszTestCopyFileObj.tearDownc csbttdD}ttd}||fVWdn1s60YWdn1sT0YdSNrFr(r.rr0rrrr get_filess  zTestCopyFileObj.get_filesc Cslt|dN}t|d$}|||Wdn1s@0YWdn1s^0YdSrh)r.rrH)ryrbrcfsrcfdstrrrassert_files_eqs  zTestCopyFileObj.assert_files_eqcCsH| \}}t||Wdn1s.0Y|ttdSr)rr copyfileobjrrr0rrrr test_content s*zTestCopyFileObj.test_contentcCs<| \}}t||Wdn1s.0YdSr)rrrrrrrtest_file_not_closed s z$TestCopyFileObj.test_file_not_closedcCs`|D\}}t|||||j|||jWdn1sR0YdSr)rrrrtellrrrrrtest_file_offset s z TestCopyFileObj.test_file_offsetrz Windows onlycCs~tjd}tttWdn1s.0Y||jdddt j t dd}| dWdn1s0Y|j}|tj|tjd}t|tWdn1s0Y||jdddt j t dd}Wdn1s0Y|j}|tj|tjd}t|tWdn1sd0Y||tdS) Nzshutil._copyfileobj_readintorrYiFrVsfoor)rrGrHrrrr0r call_argsr[r\r r]r/rRrwrr_r)rymrDrsrrr test_win_impl s"*(* ,zTestCopyFileObj.test_win_implN)r{r|r}r classmethodrrr contextlibcontextmanagerrrrrrrrr rRrrrrrrs   rc@seZdZdZdZdZdZeddZeddZ d d Z e j d d Z d dZddZddZddZddZddZddZddZddZdS) _ZeroCopyFileTestz#Tests common to all zero-copy APIs.ir6rcCsDtt|jttd}||_Wdn1s60YdSrh)rErrr.rHFILEDATA)rrDrrrr7 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)ryrrrrr zerocopy_funK sz_ZeroCopyFileTest.zerocopy_funcCs$||||dSr)rrrr:rrrrresetN sz_ZeroCopyFileTest.resetc Cs| \}}|||Wdn1s.0Y|ttdd|j|L\}}tjd}t t tWdn1s0YWdn1s0YdS)NTr0zshutil.copyfileobj) rrrrIr0rrrGrHrrr)ryrbrcrrrrtest_regular_copyV s**z#_ZeroCopyFileTest.test_regular_copyc Cs||j|J\}}|t|||Wdn1sF0YWdn1sd0Y|ttdd|j dS)NTr) rwrrrrrrrIrrrrrrtest_same_file` s   Hz _ZeroCopyFileTest.test_same_filecCsZtjtd}|t}t|dWdn1s<0Y||j j |dS)Nrnew) r[rr r]rrrrrrr)ryrRrrrrtest_non_existent_srch s *z'_ZeroCopyFileTest.test_non_existent_srcc stdtd|fdd|fddtdWdn1sT0YtdF}td}|||Wdn1s0YWdn1s0Y|tdd d dS) Nrbrccs tSrrr_r)r`rrrq r6z3_ZeroCopyFileTest.test_empty_file..cs tSrrr)rarrrr r6r(rFTrr6)rrwr.rrrIrr)rar`rtest_empty_filen s   Hz!_ZeroCopyFileTest.test_empty_filecCsHtjj|jtd"|ttjtt Wdn1s:0YdS)Nr#) rrGrH PATCHPOINTZeroDivisionErrorrrrrr0rrrrtest_unhandled_exception| s  z*_ZeroCopyFileTest.test_unhandled_exceptionc Cstjj|jttjddr|J\}}|t | ||Wdn1sV0YWdn1st0YWdn1s0YdSNyor) rrGrHrrrEINVALrrr rrrrrtest_exception_on_first_call s    z._ZeroCopyFileTest.test_exception_on_first_callc Cs|tjj|jttjddN|&\}}|t|j ||Wdn1sP0YWdn1sn0YdSr) rrGrHrrrENOSPCrrrrrrrtest_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)ryrrrrrr sz!TestZeroCopySendfile.zerocopy_func Cst|j|}ttdR}|t|||Wdn1sF0Yt ||Wdn1sp0YWdn1s0Y| t tdd|jdS)Nr(Tr) ioBytesIOrr.r0rr rrrrrIrrrrtest_non_regular_file_src s   *Hz.TestZeroCopySendfile.test_non_regular_file_srcc Csttd}tn}|t|||Wdn1sB0Yt||| d| | |j Wdn1s0YWdn1s0YdS)NrFr) r.rrrrr rrrseekrrHrrrrrtest_non_regular_file_dst s   *  z.TestZeroCopySendfile.test_non_regular_file_dstc sfdd}gtjtjjdd|dr|J\}}|t}t ||Wdn1sf0YWdn1s0YWdn1s0Y| |j j t j dS)Ncs,sd|i|SttjddS)Nr)rOrrEBADFrr'Z orig_sendfilerrrU s zDTestZeroCopySendfile.test_exception_on_second_call..sendfilerT)rUr#)r rUrrGrHrrrrrrrrr)ryrUrbrcrrrrtest_exception_on_second_call s  fz2TestZeroCopySendfile.test_exception_on_second_callc CstjjdtdH}| \}}t||Wdn1s@0YWdn1s^0Y|tt dd|j dS)Nos.fstatrTr) rrGrHrrrrrrIr0rryrrbrcrrrtest_cant_get_size s  <z'TestZeroCopySendfile.test_cant_get_sizec Cstj}d|_tjjd|dH}| \}}t||Wdn1sP0YWdn1sn0Y|t t dd|j dS)NirrTTr) rrGMockst_sizerHrrrrrIr0rryrGrrbrcrrrtest_small_chunks s  <z&TestZeroCopySendfile.test_small_chunksc Cstj}|jd|_tjjd|dH}| \}}t||Wdn1sV0YWdn1st0Y| t t dd|j dS)Ni@rrTr) rrGrrrrHrrrrrIr0rrrrrtest_big_chunk s   <z#TestZeroCopySendfile.test_big_chunkcCstjjdtd}|ttjtt|j dd}| |t j tttttddd|tjtd|ttjttd|j dd}| |d Wdn1s0YdS) NrrrrshelloTr3i)rrGrHrrrrrr0rrr r,getsizerr_r2rw)ryr blocksizerrrtest_blocksize_arg s"  z'TestZeroCopySendfile.test_blocksize_argc Csztjj|jttjddr}|J\}}|t t ||Wdn1sX0YWdn1sv0YWdn1s0Ytj|j}t t tWdn1s0YWdt _ndt _0dS)NrrT)rrGrHrrrENOTSOCKrrr rrrrr0_USE_CP_SENDFILErrrrtest_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)ryrArrrtest_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)rrNrrrr r ryrPrArrrtest_os_environ_first s & &z)TestGetTerminalSize.test_os_environ_firstcCs`t(}d|d<d|d<t}Wdn1s60Y||jd||jddS)Nrfr Zyyyr r)rrNrrr r r rrrrtest_bad_environ. s  &z$TestGetTerminalSize.test_bad_environz not on ttyrzneed 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. ZsttyrAzstty invocation failedrirr r N)rnrrrqrr"rr/rrrrNrrr)ryrArrPrrrrtest_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) Nr r  __stdout__) )fallbackrrr))(rr) rrNrWrlrrrr r r.r devnull)ryrPrArDrrr test_fallbackN s * Hz!TestGetTerminalSize.test_fallbackN)r{r|r}r rrrrr isattyrlrr^rZrrrrrrr s   rc@seZdZdZddZdS)PublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsP|ttdgd}ttds,tjdkr6|d|ttjt|dS)N__all__)rrrOr\rrrrirxrr ExecErrorrrrrr rr rrr#rrr statvfsrr) rrZrr rRrOrrr)ryZ target_apirrrtest_module_all_attributee s  z(PublicAPITests.test_module_all_attributeN)r{r|r}rrrrrrrb sr__main__)F)F)PrZ unittest.mockrr[rlrr Zos.pathrr%rrnr7r9rrrrrrrrrr r r r r rrr ImportErrorrrZ test.supportrrrr0rrrrrrrkrrrrrr'r2rErIrPrfZSUPPORTS_SENDFILErsrtZTestCaser~rrIrrr0rfrgrrrrrrrrrr{mainrrrrs8                [tP< s\Jd v N