a 5êdg—ã@s<ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZddlZddlZz ddlZWneyêdZYn0ddl m!Z!ddl"m#Z#m$Z$e#dZ%e#dZ&e#dZ'ej( )d¡Z*ej(dd …d kZ+zddl,Z,ddl-Z-d Z.Wneynd Z.Yn0z ddl/Z/Wney”dZ/Yn0d d„Z0dd„Z1d@dd„Z2dd„Z3dAdd„Z4dd„Z5dd„Z6e6ƒZ7dd„Z8Gdd„dƒZ9Gdd „d e9ej:ƒZ;Gd!d"„d"e9ej:ƒZGd'd(„d(e9ej:ƒZ?Gd)d*„d*e9ej:ƒZ@Gd+d,„d,e@ƒZAGd-d.„d.e9ej:ƒZBGd/d0„d0ej:ƒZCGd1d2„d2ej:ƒZDGd3d4„d4eEƒZFe Ge7 d5¡Gd6d7„d7eFej:ƒƒZHe Ge* d8¡Gd9d:„d:eFej:ƒƒZIGd;d<„d„d>ej:ƒZKeLd?kr8e M¡dS)BéN) Ú make_archiveÚregister_archive_formatÚunregister_archive_formatÚget_archive_formatsÚErrorÚunpack_archiveÚregister_unpack_formatÚ RegistryErrorÚunregister_unpack_formatÚget_unpack_formatsÚ SameFileErrorÚ_GiveupOnFastCopy)Úsupport)ÚTESTFNÚFakePathÚ2Z_SRCZ_DSTÚdarwinéZaixTFcOstttddƒdƒ‚dS)NZEXDEVézInvalid cross-device link)ÚOSErrorÚgetattrÚerrno©ÚargsÚkwargs©rú,/usr/local/lib/python3.9/test/test_shutil.pyÚ _fake_rename4srcst ˆ¡‡fdd„ƒ}|S)Ncs0z"tj}tt_ˆ|i|¤ŽW|t_S|t_0dS©N)ÚosÚrenamer)rrZbuiltin_rename©ÚfuncrrÚwrap9sþzmock_rename..wrap)Ú functoolsÚwraps)r"r#rr!rÚ mock_rename8sr&cCsVt|tƒrtjj|Ž}t||r"dndƒ}| |¡Wdƒn1sH0YdS)zÐWrite *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. ÚwbÚwN)Ú isinstanceÚtuplerÚpathÚjoinÚopenÚwrite)r+ZcontentÚbinaryÚfprrrÚ write_fileCs  r1cCs†dd„}t|dƒ}d dd„t|ƒDƒ¡}t|dƒ*}|||ƒD]}| |¡q@Wdƒn1sd0Ytj |¡|ks‚J‚dS) zBCreate a test file with an arbitrary size and random text content.css2||ks J‚||kr$|V||8}q |r.|VdSrr)ÚtotalÚsteprrrÚchunksQs   zwrite_test_file..chunksi ócSsg|]}t tj¡ ¡‘qSr)ÚrandomÚchoiceÚstringÚ ascii_lettersÚencode)Ú.0ÚirrrÚ Zsÿz#write_test_file..r'N)Úminr,Úranger-r.rr+Úgetsize)r+Úsizer4ÚbufsizeÚchunkÚfZcsizerrrÚwrite_test_fileOs  ÿ *rEcCsTt|tƒrtjj|Ž}t||r"dndƒ}| ¡WdƒS1sF0YdS)zÒReturn 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. ÚrbÚrN)r)r*rr+r,r-Úread)r+r/r0rrrÚ read_fileas  rIcCs|g}tt |¡ƒD]d}tj ||¡}tj |¡rltj |¡sl| |d¡t|ƒD]}| |d|¡qRq| |¡q|S)Nú/) ÚsortedrÚlistdirr+r,ÚisdirÚislinkÚappendÚrlistdir)r+ÚresÚnameÚpÚnrrrrPms  rPc CsâttdƒsdSd}d}zštjdt ¡dd }|j}| d¡Wdƒn1sT0Yt|dƒ }tjdt ¡ddÖ}|j}| ¡}| ¡}zt  ||dd¡WnTt yYWdƒWdƒW|durêt   |¡|durüt   |¡dS0WdƒWdƒW|dur0t   |¡|durDt   |¡d SWdƒn1s^0YWdƒn1s~0YW|duržt   |¡|durÞt   |¡n*|durÈt   |¡|durÜt   |¡0dS) NÚsendfileFr'©ÚdirÚdeletes 0123456789rFréT) ÚhasattrrÚtempfileÚNamedTemporaryFileÚgetcwdrRr.r-ÚfilenorUrrÚunlink)ÚsrcnameÚdstnamerDÚsrcÚdstÚinfdÚoutfdrrrÚsupports_file2file_sendfileysH (  ù    ûF    ý   rfcCsJtrBtjdkrBt dtj¡}| d¡d ¡d}t|dƒdkSdSdS) Niÿÿÿz/usr/bin/dump -o %sÚ éÿÿÿÿééi T)ÚAIXÚsysÚmaxsizeÚ subprocessÚ getoutputÚ executableÚsplitÚint)ZhdrsZmaxdatarrrÚ _maxdataOKœs rsc@seZdZddd„ZdS)ÚBaseTestNcCs$tj|t ¡d}| tj|¡|S)zjCreate a temporary directory that will be cleaned up. Returns the path of the directory. )ÚprefixrW)r[Úmkdtemprr]Ú addCleanuprÚrmtree)ÚselfruÚdrrrrv§szBaseTest.mkdtemp)N)Ú__name__Ú __module__Ú __qualname__rvrrrrrt¥srtc@sâeZdZdd„Zejdd„ƒZejdd„ƒZe  e d¡dd „ƒZ e  e d¡d d „ƒZ d d „Z e ejdd…dkd¡e eedƒoŒe ¡dkd¡dd„ƒƒZdd„Zdd„Zdd„Zdd„Zejdd „ƒZe  e d¡d!d"„ƒZdS)#Ú TestRmTreecCsX| ¡}tj |d¡}t |¡ttj |d¡dƒt |¡}| |t¡t   |¡dS)NZkillmeZsomefileÚfoo) rvrr+r,Úmkdirr1ÚfsencodeÚassertIsInstanceÚbytesÚshutilrx)ryÚtmpZvictimrrrÚtest_rmtree_works_on_bytes³s   z%TestRmTree.test_rmtree_works_on_bytescsä| ¡}tj |d¡}t |¡tj |d¡}t ||¡| ttj |¡|  tj  |¡¡|  tj  |¡¡g‰‡fdd„}tj ||d|  tˆƒd¡| ˆddtjj¡|  ˆdd|¡| ˆdddt¡dS) NrWÚlinkcsˆ |¡dSr©rO©r©ÚerrorsrrÚonerrorÇsz8TestRmTree.test_rmtree_fails_on_symlink..onerror©rŒrirrY)rvrr+r,r€ÚsymlinkÚ assertRaisesrr„rxÚ assertTrueÚexistsÚlexistsÚ assertEqualÚlenÚassertIsrNr‚©ryr…Zdir_r‡rŒrrŠrÚtest_rmtree_fails_on_symlink¼s   z'TestRmTree.test_rmtree_fails_on_symlinkc Csö| ¡}tj |d¡}tj |d¡}tj |d¡}|||fD]}t |¡q.onerrorrrirrY)rvrr+r,r€Ú_winapiÚCreateJunctionrwrr_rrr„rxrr‘r’r“r”r•rNr‚r–rrŠrÚtest_rmtree_fails_on_junctionsås    z)TestRmTree.test_rmtree_fails_on_junctionsc Csö| ¡}tj |d¡}tj |d¡}tj |d¡}|||fD]}t |¡q.onerrorrrYrri)r[ÚmktemprvrÚFileNotFoundErrorr„rxr1rr+r,ÚNotADirectoryErrorÚassertInÚ exceptionÚfilenamerr‘r“r”r•Úscandirr‚Úrmdir)ryr°ÚtmpdirÚcmZ possible_argsrŒrrŠrÚtest_rmtree_errorss2 ( zTestRmTree.test_rmtree_errorsNéÚcygwinz2This test can't be run on Cygwin (issue #1071513).Úgeteuidrz9This test can't be run reliably as root (issue #1076467).cCs d|_t t¡| tjt¡tj td¡|_ tj td¡|_ t   |j ¡t |j ¡t  t¡j}t  |j ¡j}t  |j ¡j}t jt jB}t |j |¡t |j |¡t t|¡| tjt|¡| tj|j |¡| tj|j |¡tjt|jd| |jdd¡dS)NrÚaÚbrrz1Expected call to onerror function did not happen.)Ú errorStaterr€rrwr„rxr+r,Úchild_file_pathÚchild_dir_pathrÚcreate_empty_fileÚstatÚst_modeÚS_IREADÚS_IEXECÚchmodÚcheck_args_to_onerrorr“)ryZ old_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moderrrÚ test_on_error3s*       ÿzTestRmTree.test_on_errorcCsº|jdkr‚|tjur$| ||j¡n:|tjur>| ||j¡n | |tj¡|  |t |jg¡|  t |dt ƒ¡|jd7_n4| |tj¡| |t ¡|  t |dt ƒ¡d|_dS)NrYrrir)r»rr_r“r¼r²r½r•rLr®rrÚ issubclassr)ryr"ÚargÚexcrrrrÄRs    z TestRmTree.check_args_to_onerrorcsRzDtj‰‡fdd„}|t_t t¡ttdfdƒt t¡Wˆt_nˆt_0dS)Ncs|tkrtƒ‚nˆ|ƒSdSr)rr)Úfnrr©Z orig_lstatrrÚraiserpszFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat..raiserr)rÚlstatr€rr1r„rx)ryrËrrÊrÚ+test_rmtree_does_not_choke_on_failing_lstatms   z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatcsÜtjtjtjtjhtjko0tjtjvo0tjtjv}|r¾|  t j ¡|  t j j ¡| ¡}tj |d¡}t |¡zBt j}Gdd„dtƒ‰‡fdd„}|t _| ˆt j |¡W|t _qØ|t _0n| t j ¡| t j j ¡dS)Nr¹c@s eZdZdS)zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available..CalledN)r{r|r}rrrrÚCalledŠr5rÎcsˆ‚dSrrr©rÎrrÚ_raiser‹szITestRmTree.test_rmtree_uses_safe_fd_version_if_available.._raiser)rr-r¿r_r²Úsupports_dir_fdrLÚ supports_fdÚsupports_follow_symlinksrr„Ú_use_fd_functionsrxÚavoids_symlink_attacksrvr+r,r€Ú_rmtree_safe_fdÚ Exceptionrr )ryrÔÚtmp_dirrzZ real_rmtreerÐrrÏrÚ-test_rmtree_uses_safe_fd_version_if_available}s,ÿ þ ý    z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablecCs<tj| ¡d\}}t |¡| ttj|¡t  |¡dS©Nr§) r[ÚmkstemprvrÚcloserr­r„rxÚremove)ryÚhandler+rrrÚtest_rmtree_dont_delete_file•s z'TestRmTree.test_rmtree_dont_delete_filec Cs‚t t¡zbtj td¡}tj td¡}t |¡t ||¡| ttj |¡tj |ddWtj tddntj tdd0dS)NÚcheeseÚshopTr¨) rr€rr+r,rŽrrr„rx©ryrbrcrrrÚtest_rmtree_on_symlinkœs   z!TestRmTree.test_rmtree_on_symlinkc Csšt t¡zztj td¡}tj td¡}t |¡ttj |d¡dƒ ¡t ||¡|  t t j |¡t j |ddWt j tddnt j tdd0dS)NràráZspamr'Tr¨) rr€rr+r,r-rÜr£r¤rrr„rxrârrrÚtest_rmtree_on_junctionªs   z"TestRmTree.test_rmtree_on_junction)r{r|r}r†rÚskip_unless_symlinkr—r¢ÚunittestÚ skipUnlessr£r¥r¦rµÚskipIfrlÚplatformrZrr¸rÅrÄrÍrÙrßrãrärrrrr~±s2       $ÿÿ  r~c@s²eZdZdd„Zdd„Zejdd„ƒZdd„Zd d „Z d d „Z e j   d ¡dd„ƒZdd„Ze  eedƒd¡ejdd„ƒƒZdd„Zejdd„ƒZejdd„ƒZdd„Zdd„Zd S)!Ú TestCopyTreec Cs| ¡}tj | ¡d¡}| tj|¡| tjtj |¡¡t|dfdƒt  tj |d¡¡t|ddfdƒt  ||¡|  tj  tj |d¡¡¡|  tj  tj |d¡¡¡|  tj  tj |dd¡¡¡t|dfƒ}| |d¡t|ddfƒ}| |d¡dS)NÚ destinationútest.txtÚ123Útest_dirÚ456)rvrr+r,rwr„rxÚdirnamer1r€ÚcopytreerÚisfilerMrIr“©ryÚsrc_dirÚdst_dirÚactualrrrÚtest_copytree_simple»s" ÿ  z!TestCopyTree.test_copytree_simplec CsZ| ¡}| ¡}| tj|¡| tj|¡t|dfdƒt tj |d¡¡t tj |d¡¡t|ddfdƒt|ddfdƒtj ||dd|  tj  tj |d¡¡¡|  tj  tj |d¡¡¡|  tj  tj |dd¡¡¡t |dfƒ}| |d¡t |ddfƒ}| |d¡| t¡ tj ||d dWdƒn1sL0YdS) Nznonexisting.txtríZ existing_dirz existing.txtzwill be replacedzhas been replacedT)Ú dirs_exist_okF)rvrwr„rxr1rr€r+r,rñrròrMrIr“rÚFileExistsErrorrórrrÚtest_copytree_dirs_exist_okÎs*ÿ    z(TestCopyTree.test_copytree_dirs_exist_okc Cs”| ¡}tj |d¡}tj |d¡}tj |d¡}t |¡t |¡t|dfdƒtj |d¡}tj |d¡}t tj |d¡|¡ttdƒr¤t |t j t j B¡ttd ƒrÆtt d ƒrÆt  |t j ¡t |¡}tj||d d | tj tj |dd¡¡¡t tj |dd¡¡}tjd kr8| d¡r8|dd…}| |tj |d¡¡t |¡} ttdƒrt| | j|j¡ttd ƒr| | j|j¡dS)NrbrcÚsubzfile.txtrr‡zsub/linkÚlchmodÚlchflagsÚ UF_NODUMPT©ÚsymlinksÚntz\\?\é)rvrr+r,r€r1rŽrZrür¿ÚS_IRWXUÚS_IRWXOrýrþrÌr„rñrrNÚreadlinkrRÚ startswithr“rÀÚst_flags) ryrØrôrõZsub_dirÚsrc_linkÚdst_linkÚsrc_statröÚdst_statrrrÚtest_copytree_symlinksçs8  ÿ      z#TestCopyTree.test_copytree_symlinksc Cs^tjj}tjj}| ¡}z || ¡dƒ}t|dfdƒt|dfdƒt ||dƒ¡t|ddfdƒt ||dƒ¡t|ddfdƒt ||ddƒ¡t ||dd ƒ¡t|dddfdƒt|dd d fdƒzft d d¡}tj |||d |  |||dƒƒ¡|  |||dƒƒ¡|  |||dƒƒ¡Wt  |¡n t  |¡0zjt d d ¡}tj |||d |  |||dƒƒ¡|  |||dd ƒƒ¡|  |||ddƒƒ¡Wt  |¡n t  |¡0zTdd„}tj |||d |  |||dd d ƒƒ¡|  |||ddƒƒ¡Wt  |¡n t  |¡0Wt  |¡t  tj  |¡¡nt  |¡t  tj  |¡¡0dS)Nrërìríztest.tmprîrïZ test_dir2ÚsubdirZsubdir2ztest.pyz*.tmp©Úignorezsubdir*cSsfg}|D]X}tj ||¡}tj |¡rB| ¡ddkrB| |¡qtj |¡ddvr| |¡q|S)Nrhr z.py)rr+r,rMrqrOÚsplitext)rbÚnamesrQrRr+rrrÚ_filter/s ÿ  z8TestCopyTree.test_copytree_with_exclude.._filter)rr+r,r‘rvr1r€r„Úignore_patternsrñrr rxrð)ryr,r‘rôrõÚpatternsrrrrÚtest_copytree_with_excludesR   ÿ ÿ z'TestCopyTree.test_copytree_with_excludecsVtjj}tjj}ˆ ¡}||dƒ}t ||ƒ¡t ||dƒ¡t tj |dd¡¡t|dddfdƒg‰‡‡fdd„}|ˆ ¡dƒ}tj|||d ˆ  |||dddƒƒ¡|ˆ ¡dƒ}tjt   |¡||d ˆ  |||dddƒƒ¡|ˆ ¡dƒ}t t  |¡ƒd }ˆ |tj¡tj|||d ˆ  |||dddƒƒ¡ˆ tˆƒd ¡dS) NÚsourcerîr rìrïcsTˆ |¡ˆ |t¡ˆ |t¡ˆ t|ƒtt|ƒƒ¡|D]}ˆ |t¡q>gSr)rOr‚ÚstrÚlistr“r”Úset)rbrrR©Z invokationsryrrÚ_ignoreVs   z?TestCopyTree.test_copytree_arg_types_of_ignore.._ignorerërré )rr+r,r‘rvr€r1r„rñrÚpathlibÚPathrr±r‚ÚDirEntryr“r”)ryr,r‘rØrôrrõZ src_dir_entryrrrÚ!test_copytree_arg_types_of_ignoreHs8  ÿÿÿz.TestCopyTree.test_copytree_arg_types_of_ignorec Csx| ¡}tj |d¡}t |¡tj |d¡}| tj|¡t |d¡t |dfdƒt tj |d¡d¡t |dfdƒt tj |d¡d¡t j|d }| t j|¡t |d¡t  ||¡|  t |¡jt |¡j¡|  t tj |d¡¡jt tj |d¡¡j¡|  t tj |d¡¡jt tj |d¡¡j¡tj |tj |¡d ¡}|  t |¡jt |¡j¡dS) Nrrëiÿzpermissive.txtrízrestrictive.txtrïi€r§ri)rvrr+r,r€rwr„rxrÃr1r[rrñr“r¿rÀrq)ryrØrôrõZrestrictive_subdirZrestrictive_subdir_dstrrrÚ!test_copytree_retains_permissionsrs6     ÿÿÿ ÿz.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs„| ¡}tj | ¡d¡}| tj|¡| tjtj |¡¡tdƒ|_ |  tj ¡t  ||¡Wdƒn1sv0YdS)Nrëzka-boom) rvrr+r,rwr„rxrðÚPermissionErrorÚ side_effectrrrñ)ryZ mock_patchrôrõrrrÚtest_copytree_winerrors z#TestCopyTree.test_copytree_winerrorcsއ‡‡‡fdd„}g‰ˆ ¡‰tjˆ ¡d‰ttj ˆd¡dƒ}| ¡Wdƒn1s`0Ytj ˆˆ|dˆ  t ˆƒd¡dS)NcsRˆ d¡ˆ |t¡ˆ |t¡ˆ |tj ˆd¡¡ˆ |tj ˆd¡¡dS©Nr)rOr‚rr“rr+r,)r¹rº©rcÚflagryrbrrÚ custom_cpfuns    zETestCopyTree.test_copytree_custom_copy_function..custom_cpfunr§rr(©Ú copy_functionri) rvr[r«r-rr+r,rÜr„rñr“r”)ryr(rDrr&rÚ"test_copytree_custom_copy_function›s&z/TestCopyTree.test_copytree_custom_copy_functionÚmkfifoúrequires os.mkfifo()c Cs2t t¡ztj td¡}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| d¡Wtjtdd tjt dd ntjtdd tjt dd 0dS) Nr Zmypipeúos.mkfifo(): %srriz`%s` is a named pipez$shutil.Error should have been raisedTr¨)rr€rr+r,r,r"ÚskipTestr„rñÚTESTFN2rrr“r”Úfailrx)ryr ÚpipeÚer‹rbrcZ error_msgrrrÚtest_copytree_named_pipe­s*  $ & ÿz%TestCopyTree.test_copytree_named_pipecs€| ¡}tj | ¡d¡}t|dfdƒt tj |d¡¡t|ddfdƒg‰‡fdd„}tj|||d| t ˆƒd ¡dS) Nrërìrírîrïcsˆ ||f¡dSrrˆ©rbrc©ZcopiedrrÚ_copyÎsz6TestCopyTree.test_copytree_special_func.._copyr)rY) rvrr+r,r1r€r„rñr“r”)ryrôrõr7rr6rÚtest_copytree_special_funcÆs z'TestCopyTree.test_copytree_special_funccCsÒ| ¡}tj | ¡d¡}t dtj |d¡¡t tj |d¡¡t|ddfdƒ| tt j ||¡tj | ¡d¡}t j ||dd|  dt  |¡¡tj | ¡d ¡}t j ||dd |  dt  |¡¡dS) NrëZ IDONTEXISTrìrîrïÚ destination2T)Úignore_dangling_symlinksZ destination3rÿ)rvrr+r,rŽr€r1rrr„rñÚ assertNotInrLr®©ryrôrõrrrÚtest_copytree_dangling_symlinksÔsz,TestCopyTree.test_copytree_dangling_symlinksc Cs.| ¡}tj | ¡d¡}t tj |d¡¡ttj |dd¡dƒWdƒn1sZ0Ytjtj |d¡tj |d¡ddtj||dd |  tj  tj |d¡¡¡|  dt  tj |d¡¡¡tj | ¡d ¡}tj||dd |  tj  tj |d¡¡¡|  dt  tj |d¡¡¡dS) NrëZreal_dirrìr(Z link_to_dirT)Útarget_is_directoryFrÿr9)rvrr+r,r€r-rŽr„rñr rNr®rLrr<rrrÚtest_copytree_symlink_dirès  þz&TestCopyTree.test_copytree_symlink_dircCs\| ¡}|d}| tj|d¡tj |d¡}t|dƒt ||¡}|  dgt  |¡¡dS)NÚdestTr) rvrwr„rxrr+r,r1rñr“rL)ryrôrõrbÚrvrrrÚtest_copytree_return_valueüs  z'TestCopyTree.test_copytree_return_valuecCs€| ¡}|jtj|ddtj |dd¡}tj |dd¡}t |¡tj |d¡}t|dƒt  ||¡}|  dgt  |¡¡dS)NTr¨ÚtZpgZ somevendorz1.0Zpol) rvrwr„rxrr+r,Úmakedirsr1rñr“rL)ryÚbase_dirrôrõrbrArrrÚtest_copytree_subdirectorys   z'TestCopyTree.test_copytree_subdirectoryN)r{r|r}r÷rúrrår rr r!ræÚmockÚpatchr$r+rçrZrr4r8r=r?rBrFrrrrrê¹s( A*      rêc@s’eZdZejdd„ƒZe ee dƒd¡ejdd„ƒƒZ e  ee dƒd¡ejdd „ƒƒZ ejd d „ƒZ e ee d ƒo„eed ƒo„eedƒd¡dd„ƒZejdd„ƒZejeje ee dƒoÀe  ¡dkd¡dd„ƒƒƒZdd„Zdd„Zejdd„ƒZe ee dƒd ¡d!d"„ƒZejd#d$„ƒZejd%d&„ƒZd'd(„Zejd)d*„ƒZe ee d+ƒd,¡d-d.„ƒZejd/d0„ƒZe ee d1ƒd2¡d3d4„ƒZd5d6„Zd7d8„Z d9S):ÚTestCopycCs„| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt|dƒt ||¡t ||¡t |tjtj B¡t |tj ¡|  t |¡j t |¡j ¡t  ||¡| t |¡j t |¡j ¡tjdkr€t |tj ¡t  ||¡| t |¡j t |¡j ¡t |tj ¡t  ||¡| t |¡j t |¡j ¡t |tj ¡t  ||¡| t |¡j t |¡j ¡dS)NrÚbarÚbazÚquuxr)rvrr+r,r1rŽrÃr¿rÚS_IRWXGrÚassertNotEqualrÀr„Úcopymoder“rR©ryrØrbrcrr rrrÚtest_copymode_follow_symlinkss0         z&TestCopy.test_copymode_follow_symlinksrüzrequires os.lchmodcCsp| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt|dƒt ||¡t ||¡t |tjtj B¡t |tj¡t  |tj tj B¡t  |tj ¡t j ||dd| t |¡jt |¡j¡| t |¡jt |¡j¡t  |tj ¡t j ||dd| t |¡jt |¡j¡t  |tj ¡t j ||dd| t |¡jt |¡j¡dS©NrrJrKrLF©Úfollow_symlinks)rvrr+r,r1rŽrÃr¿rrMrürr„rOr“rÌrÀrNrPrrrÚ test_copymode_symlink_to_symlink6s0     ÿz)TestCopy.test_copymode_symlink_to_symlinkz requires os.lchmod to be missingcCs€| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt|dƒt ||¡t ||¡tj||dddSrR)rvrr+r,r1rŽr„rOrPrrrÚ*test_copymode_symlink_to_symlink_wo_lchmodTs    z3TestCopy.test_copymode_symlink_to_symlink_wo_lchmodc Csî| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt |¡}t ||j|jdf¡t|dƒ|  t |¡jt |¡j¡t  ||¡t  ||¡t tdƒrÂt  |tj ¡t tdƒrät tdƒrät |tj¡t |¡}t tdƒr tj||d d |  |jt |¡j¡tj||d d t |¡}tjtjvrpd D]"} | t|| ƒt|| ƒd ¡qLt tdƒrŒ| |j|j¡t tdƒr´t |dƒr´| |j|j¡tj||d d | tt |¡jt |¡jƒdk¡dS)NrrJrKÚquxgE@rürýrþTrSF©Úst_atimeÚst_mtimerirgš™™™™™¹?)rvrr+r,r1r¿ÚutimerYrZrNrŽrZrürrýrþrÌr„ÚcopystatrÀrÓÚassertLessEqualrr“rrÚabs) ryrØrbrcrr r Ú src_link_statZ dst_link_statÚattrrrrÚtest_copystat_symlinksdsJ   ÿ         ÿ ÿzTestCopy.test_copystat_symlinksÚchflagsÚ EOPNOTSUPPÚENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPcCsª| ¡}tj |d¡}tj |d¡}t|dƒt|dƒdd„}tj}zVtjtjfD]}||ƒt_t   ||¡qT|tjtjƒt_|  t t j ||¡W|t_n|t_0dS)NrœÚfile2Úxxxcstƒ‰ddœ‡‡fdd„ }|S)NTrScsˆˆ_ˆ‚dSr)r)r+ÚflagsrT©ÚerrÚexrrÚ_chflags_raiser›szlTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser.._chflags_raiser©r)rirkrrhrÚmake_chflags_raiser˜szSTestCopy.test_copystat_handles_harmless_chflags_errors..make_chflags_raiser) rvrr+r,r1rbrrcrdr„r\rr)ryr³rœrermZ old_chflagsrirrrÚ-test_copystat_handles_harmless_chflags_errorss   z6TestCopy.test_copystat_handles_harmless_chflags_errorscs | ¡}tj |d¡‰tˆdƒtj |d¡}t|dƒt ˆ|¡t ˆdd¡t ˆdd¡t ˆ|¡| t t  ˆ¡ƒt t  |¡ƒ¡| t  ˆd¡t  |d¡¡t  |¡t|dƒt tjdƒ‰‡‡fdd „}z4tj‰|t_t ˆ|¡| dt  |¡¡Wˆt_nˆt_0d d œ‡‡fd d „ }z"tj ‰|t_ t ˆ|¡Wˆt_ nˆt_ 0tj |d¡‰tj |d¡}tˆˆƒt||ƒt ˆdd¡t |dd¡t |d¡tj |d¡}tj |d¡}t||ƒt||ƒt ˆ|¡t ||¡| t  |d¡d¡| t  |d¡d¡dS)NrrJúuser.fooó42zuser.baró43ÚEPERMcs&|dkrˆ‚nˆ|||fi|¤ŽdS)Nror)Úfnamer`Úvalr)Ú orig_setxattrÚos_errorrrÚ_raise_on_user_fooÃsz3TestCopy.test_copyxattr.._raise_on_user_fooTrScs |ˆkrttjdƒ‚ˆ||dS)NzOperation not supportedrS)rrrd)rsrT)Úorig_listxattrrbrrÚ _raise_on_srcÐs z.TestCopy.test_copyxattr.._raise_on_srcZ the_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZ the_copy_ro)rvrr+r,r1r„Ú _copyxattrÚsetxattrr“rKÚ listxattrÚgetxattrrÝrrrrr®rÃr\)ryrØrcrwryZsrcroZdstror)rxrurvrbrÚtest_copyxattr¬sZ       þ           zTestCopy.test_copyxattrr¸rúroot privileges requiredcCsî| ¡}tj |d¡}tj |d¡}t|dƒt ||¡t |dd¡tj|ddddtj |d¡}tj |d ¡}t|dƒt ||¡tj||dd|  tj |dddd¡|  t tj |d¡tj||dd|  t  |d¡d¡dS) NrrKz trusted.foorprqFrSrJrW) rvrr+r,r1rŽr{r„rzr“r}rr)ryrØrbrrcr rrrÚtest_copyxattr_symlinksìs     z TestCopy.test_copyxattr_symlinkscCsPd}| ¡}t||fdƒtj ||¡}| ¡}|||ƒtj ||¡}||fS)Nrìrf)rvr1rr+r,)ryÚmethodrsr³rœÚtmpdir2rerrrÚ _copy_files zTestCopy._copy_filecCsB| tj¡\}}| tj |¡¡| t |¡j t |¡j ¡dSr) rƒr„Úcopyrrr+r‘r“r¿rÀ)ryrœrerrrÚ test_copyszTestCopy.test_copycCs | ¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt ||¡ttdƒrft |tj tj B¡t j ||dd|  tj |¡¡| t|ƒt|ƒ¡t |¡t j ||dd| tj |¡¡| t |¡t |¡¡ttdƒr| t |¡jt |¡j¡dS)NrrJrKrüTrSF)rvrr+r,r1rŽrZrür¿rrr„r„r rNr“rIrÝrrrÌrÀ)ryrØrbrcrrrrÚtest_copy_symlinkss&      ÿzTestCopy.test_copy_symlinksr[zrequires os.utimecCsœ| tj¡\}}| tj |¡¡t |¡}t |¡}| |j |j ¡dD] }|  t ||ƒt ||ƒd¡qJt tdƒr˜t |dƒr˜| t |dƒt |dƒ¡dS)NrXrirbr) rƒr„Úcopy2rrr+r‘r¿r“rÀr]rrZ)ryrœreZ file1_statZ file2_statr`rrrÚ test_copy20s    ÿ ÿzTestCopy.test_copy2c Cs®| ¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt ||¡ttdƒrft |tj tj B¡ttdƒrˆttdƒrˆt  |tj ¡t |¡}t  |¡}tj||dd| tj |¡¡| t|ƒt|ƒ¡t |¡tj||d d| tj |¡¡| t |¡t |¡¡t  |¡}tjtjvrVd D]"}| t||ƒt||ƒd ¡q2ttdƒr‚| |j|j¡| |j|j¡ttdƒrªt|d ƒrª| |j|j¡dS) NrrJrKrürýrþTrSFrXrir)rvrr+r,r1rŽrZrür¿rrrýrþrÌr„r‡r rNr“rIrÝrrr[rÓr]rrÀrNr) ryrØrbrcrr r_r r`rrrÚtest_copy2_symlinksAs<         ÿ zTestCopy.test_copy2_symlinkscCsr| ¡}tj |d¡}tj |d¡}t|dƒt |dd¡t ||¡| t  |d¡t  |d¡¡t  |¡dS)NrrJrorp) rvrr+r,r1r{r„r‡r“r}rÝ)ryrØrbrcrrrÚtest_copy2_xattrds    þzTestCopy.test_copy2_xattrcCsˆtjtjfD]v}| ¡}| ¡}tj |d¡}t|dƒ|||ƒ}| |tj |d¡¡||tj |d¡ƒ}| |tj |d¡¡q dS)NrrJ) r„r„r‡rvrr+r,r1r“)ryrÉrôrõrbrArrrÚtest_copy_return_valueqs  zTestCopy.test_copy_return_valuecCs²| ¡}tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒt ||¡tj||dd| tj  |¡¡|  t  |¡t  |¡¡t ||¡|  tj  |¡¡dS)Nrbrcr r‡rFrS) rvrr+r,r1rŽr„ÚcopyfilerrNr“rr )ryrØrbrcr r‡rrrÚtest_copyfile_symlinkss   zTestCopy.test_copyfile_symlinksr‡zrequires os.linkc Cst t¡tj td¡}tj td¡}zât|dƒ}| d¡Wdƒn1sR0Yzt ||¡Wn2tyž}z|  d|¡WYd}~n d}~00|  t j t j ||¡t|dƒ }| | ¡d¡Wdƒn1sä0Yt |¡Wt jtddnt jtdd0dS) Nràrár(Úcheddarz os.link(): %srGTr¨)rr€rr+r,r-r.r‡r"r/rr„r rŒr“rHrÝrx)ryrbrcrDr3rrrÚ'test_dont_copy_file_onto_link_to_itselfs  ($ . z0TestCopy.test_dont_copy_file_onto_link_to_itselfc Csæt t¡tj td¡}tj td¡}zªt|dƒ}| d¡Wdƒn1sR0Yt d|¡| t j t j ||¡t|dƒ }|  |  ¡d¡Wdƒn1s¬0Yt |¡Wt jtddnt jtdd0dS)Nràrár(rŽrGTr¨)rr€rr+r,r-r.rŽrr„r rŒr“rHrÝrx)ryrbrcrDrrrÚ*test_dont_copy_file_onto_symlink_to_itself¤s  (  . z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr,r-c CsŠzt t¡Wn2ty@}z| d|¡WYd}~n d}~00z6| tjtjtt ¡| tjtjt t¡Wt  t¡n t  t¡0dS)Nr.) rr,rr"r/rr„ÚSpecialFileErrorrŒr0Ú__file__rÝ)ryr3rrrÚtest_copyfile_named_pipe¹s$ÿÿz!TestCopy.test_copyfile_named_pipecCsl| ¡}| ¡}tj |d¡}tj |d¡}t|dƒt ||¡}| tj |¡¡|  t |ƒt |ƒ¡dS)NrJr) rvrr+r,r1r„rŒrr‘r“rI)ryrôrõÚdst_fileÚsrc_filerArrrÚtest_copyfile_return_valueÇs  z#TestCopy.test_copyfile_return_valuecCsX| ¡}tj |d¡}t|dƒ| ttj||¡| t tj||¡|  t |ƒd¡dSr%) rvrr+r,r1rr r„rŒrr“rI)ryrôr•rrrÚtest_copyfile_same_fileÒs  z TestCopy.test_copyfile_same_fileN)!r{r|r}rrårQrærçrZrrUrèrVrarrnZskip_unless_xattrr~r¸r€rƒr…r†rˆr‰rŠr‹rrrr“r–r—rrrrrIs\    (ÿý  ?ÿ    "      rIc@sveZdZe ¡dd„ƒZdd„Zd7dd„Ze ¡e  e   d¡d ¡d d „ƒƒZ e ¡d d „ƒZ e ¡e  e   d¡d¡dd„ƒƒZe ¡e  e   d¡d¡dd„ƒƒZdd„Ze ¡dd„ƒZe ¡e  ed¡dd„ƒƒZdd„Zdd „Ze ¡d!d"„ƒZd#d$„Zd%d&„Zd'd(„Zd)d*„Ze ¡d+d,„ƒZe ¡d-d.„ƒZe ¡e e oJe!ƒ d/¡d0d1„ƒƒZ"e ¡d2d3„ƒZ#d4d5„Z$d6S)8Ú TestArchivesc Csª| d¡\}}| ¡}t |¡tj |¡}tj tj |¡d¡}t  |¡*tj  |¡}t |d|dƒ}Wdƒn1s|0Y|  ||d¡|  tj |¡¡|  t |¡¡t |d¡$}| | ¡gd¢¡Wdƒn1sî0Yt  |¡t |d|dƒ}Wdƒn1s(0Y|  ||d ¡|  tj |¡¡|  t |¡¡t |d ¡$}| | ¡gd¢¡Wdƒn1sœ0YdS) NrªÚarchiveÚgztarÚ.ú.tar.gzzr:gz)r›z./subz./sub2z./file1z./file2z ./sub/file3Útarú.tarrG)Ú _create_filesrvrr²r+rðr,ÚbasenamerÚ change_cwdÚabspathrr“rròÚtarfileZ is_tarfiler-ÚassertCountEqualÚgetnames) ryÚroot_dirrEr‚Úwork_dirÚ rel_base_nameÚ base_nameÚtarballZtfrrrÚtest_make_tarballãs0    , ÿ" . ÿzTestArchives.test_make_tarballcCsFt |¡(}| ¡}| ¡t|ƒWdƒS1s80YdSr)r£r-r¥Úsortr*)ryr+rrrrrÚ_tarinfos zTestArchives._tarinfoÚdistcCs’| ¡}tj ||¡}tj|ddt|dfdƒt|dfdƒt tj |d¡¡t|ddfdƒt tj |d¡¡|rŠt|d fdƒ||fS) NT)Úexist_okrœrfrerûZfile3Zsub2Úouter)rvrr+r,rDr1r€)ryrEr¦r®rrrrŸ 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) Nr™ršrœz archive2.tarrz-cf©ÚcwdÚstdoutržT)Údry_run) rŸrr+r,rvrr“rròrnÚ check_callÚDEVNULLr­)ryr¦rEr©rªZtarball2Ztar_cmdrrrÚtest_tarfile_vs_tars(  ÿ ÿz TestArchives.test_tarfile_vs_tarc Cs®| ¡\}}| ¡}t |¡tj |¡}tj tj |¡d¡}t  |¡(tj  |¡}t |d|ƒ}Wdƒn1sx0Y|  ||d¡|  tj |¡¡|  t |¡¡t |¡$}| | ¡gd¢¡Wdƒn1sè0Yt  |¡*tj  |¡}t |d||ƒ}Wdƒn1s.0Y|  ||d¡|  tj |¡¡|  t |¡¡t |¡$}| | ¡gd¢¡Wdƒn1s 0YdS)Nr™Úzipú.zip)údist/ú dist/sub/ú dist/sub2/ú dist/file1ú dist/file2údist/sub/file3r°)rºr»r¼r½r¾r¿)rŸrvrr²r+rðr,r rr¡r¢rr“rròÚzipfileÚ is_zipfileÚZipFiler¤Únamelist) ryr¦rEr‚r§r¨r©rQÚzfrrrÚtest_make_zipfile<s2     *  ÿ"  .  ÿzTestArchives.test_make_zipfiler¸zNeed the zip command to runc Cs | ¡\}}tj | ¡d¡}t|d||ƒ}| ||d¡| tj |¡¡tj |d¡}dddd|g}t j ||t j d| tj |¡¡t   |¡}| ¡}Wdƒn1s¶0Yt   |¡}| ¡} Wdƒn1sè0Y| t|ƒt| ƒ¡dS)Nr™r¸r¹z archive2.zipz-qz-rr±)rŸrr+r,rvrr“rròrnrµr¶rÀrÂrÃrK) ryr¦rEr©r™Zarchive2Úzip_cmdrÄrZnames2rrrÚtest_zipfile_vs_zipas  ÿ & &z TestArchives.test_zipfile_vs_zipÚunzipzNeed 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}~00Wdƒn1sê0YdS) Nr™r¸r¹rÈz-t)ÚstderrÚreplacerŠzunrecognized option: tzunzip doesn't support -tz{} **Unzip Output** {})rŸrr+r,rvrr“rròrr¡rnÚ check_outputÚSTDOUTÚCalledProcessErrorÚoutputÚdecoder/r1Úformat) ryr¦rEr©r™rÆrÈZdetailsÚmsgrrrÚtest_unzip_zipfile{s    zTestArchives.test_unzip_zipfilecCs*| ¡}tj |d¡}| tt|d¡dS)Nr™rf)rvrr+r,rÚ ValueErrorr)ryr³r©rrrÚtest_make_archive“szTestArchives.test_make_archivecCsÞtr"t d¡d}t d¡d}nd}}| ¡\}}tj |  ¡d¡}t |d||||d}|  tj  |¡¡t |d||ƒ}|  tj  |¡¡t |d||||d}|  tj  |¡¡t |d||ddd}|  tj  |¡¡dS) NrÚrootr™r¸©ÚownerÚgrouprZ kjhkjhkjgZoihohoh) ÚUID_GID_SUPPORTÚgrpÚgetgrgidÚpwdÚgetpwuidrŸrr+r,rvrrrò)ryrØr×r¦rEr©rQrrrÚtest_make_archive_owner_group˜s(  ÿ ÿ ÿz*TestArchives.test_make_archive_owner_groupúRequires grp and pwd supportc CsÚ| ¡\}}tj | ¡d¡}t d¡d}t d¡d}t   |¡$t |d|d||d}Wdƒn1sn0Y|  tj  |¡¡t |¡}z6| ¡D] }| |jd¡| |jd¡qžW| ¡n | ¡0dS)Nr™rršr®rÖ)rŸrr+r,rvrÚrÛrÜrÝrr¡rrròr£r-Z getmembersr“ÚuidÚgidrÜ) ryr¦rEr©rØr×Ú archive_namer™ÚmemberrrrÚtest_tarfile_root_owner´s   ÿ$  z$TestArchives.test_tarfile_root_ownercCstt ¡}dd„}td|gdƒzFztdd| ¡dWntyHYn0| t ¡|¡Wtdƒn tdƒ0dS)Nc_s tƒ‚dSr)Ú RuntimeError)rÚkwrrrÚ_breaksÍsz3TestArchives.test_make_archive_cwd.._breaksrfúxxx file)r¦)rr]rrrvr×r“r)ryZ current_dirrçrrrÚtest_make_archive_cwdËs z"TestArchives.test_make_archive_cwdcCsZ| ¡}t |¡4| tddƒd¡| tj d¡¡Wdƒn1sL0YdS)NÚtestrztest.tar© rvrr¡r“rrrr+rò©ryr¦rrrÚtest_make_tarfile_in_curdirÚs z(TestArchives.test_make_tarfile_in_curdircCsZ| ¡}t |¡4| tddƒd¡| tj d¡¡Wdƒn1sL0YdS)Nrêr¸ztest.ziprërìrrrÚtest_make_zipfile_in_curdirás z(TestArchives.test_make_zipfile_in_curdircCs˜| ttdd¡| ttddd„d¡| ttddd„ddg¡tddd„dgd ƒd d „tƒDƒ}| d|¡tdƒd d „tƒDƒ}| d|¡dS) NrfricSstSr©ÚxrrrrÚìr5z;TestArchives.test_register_archive_format..cSstSrrïrrrrrñîr5)rirY)rirYrcSstSrrïrrrrrññr5rècSsg|] \}}|‘qSrr©r;rRÚparamsrrrr=òr5z=TestArchives.test_register_archive_format..cSsg|] \}}|‘qSrrròrrrr=ör5)rÚ TypeErrorrrr®rr;)ryÚformatsrrrÚtest_register_archive_formatésÿÿ z)TestArchives.test_register_archive_formatcCs.| |dd„¡| |tj¡| |t¡dS)NcSs|Srr©r+rrrrñür5z3TestArchives.check_unpack_archive..)Ú#check_unpack_archive_with_converterrrr)ryrÐrrrÚcheck_unpack_archiveûsz!TestArchives.check_unpack_archivec CsÄ| ¡\}}t|ƒ}| d¡tj | ¡d¡}t||||ƒ}| ¡}t||ƒ||ƒƒ|  t|ƒ|¡| ¡} t||ƒ|| ƒ|d|  t| ƒ|¡|  t j t|t ƒ¡|j tt|t ƒdddS)Nr°r™)rÐrf)rŸrPrÝrr+r,rvrrr“rr„Ú ReadErrorrrÓ) ryrÐÚ converterr¦rEÚexpectedr©r°r‚Ztmpdir3rrrrøs  z0TestArchives.check_unpack_archive_with_convertercCs| d¡dS)Nr©rù©ryrrrÚtest_unpack_archive_tarsz$TestArchives.test_unpack_archive_tarcCs| d¡dS)NršrýrþrrrÚtest_unpack_archive_gztarsz&TestArchives.test_unpack_archive_gztarcCs| d¡dS)NÚbztarrýrþrrrÚtest_unpack_archive_bztarsz&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCs| d¡dS)NÚxztarrýrþrrrÚtest_unpack_archive_xztar sz&TestArchives.test_unpack_archive_xztarcCs| d¡dS)Nr¸rýrþrrrÚtest_unpack_archive_zip%sz$TestArchives.test_unpack_archive_zipcs tƒ}‡fdd„}tdddg|dgƒtddƒˆ ttd dg|¡tdƒtd dg|ƒˆ d dgd ftƒ¡ˆ ddgd ftƒ¡td ƒˆ tƒ|¡dS) Ncs(ˆ |d¡ˆ |d¡ˆ |d¡dS)Nriú stuff.booÚxx)r“)r°Ú extract_dirÚextrarþrrÚ_boo-s  z/TestArchives.test_unpack_registry.._booZBooz.booz.b2)r rirrZBoo2rª) r rrrr r r®r;r“)ryrõr rrþrÚtest_unpack_registry)s   ÿz!TestArchives.test_unpack_registryN)r®)%r{r|r}rZ requires_zlibr«r­rŸrærçr„Úwhichr·rÅrÇrÒrÔrÞrÙrärérírîrörùrørÿrZ requires_bz2rZ requires_lzmarèrkrsrrr rrrrr˜ßsZ #  ÿ  $ ÿ  ÿ         r˜c@sLeZdZe eedƒd¡dd„ƒZe ed¡e ee dƒd¡dd „ƒƒZ d S) ÚTestMiscÚ disk_usagez)disk_usage not available on this platformcCs†t tj t¡¡}dD]}| t||ƒt¡q|  |j d¡|  |j d¡|  |j d¡|  |j |j ¡|  |j |j ¡t t¡dS)N)r2ÚusedÚfreer)r„rrr+rðr’r‚rrrZ assertGreaterr2rÚassertGreaterEqualr)ryÚusager`rrrÚtest_disk_usageFszTestMisc.test_disk_usagerßÚchownzrequires os.chowncs‚ˆ ¡}tj|d‰tˆdƒˆ t¡t ˆ¡Wdƒn1sH0Yˆ t¡tjˆddWdƒn1s€0Yˆ t¡tjˆddWdƒn1s¸0Yˆ t ¡t ˆd¡Wdƒn1sî0Yˆ t ¡t ˆd¡Wdƒn1s&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)Nr§ztesting chown functionznon-existing username)Úuserznon-existing groupname)rØóspamg…ëQ¸ @cs:t ˆ¡}|dur ˆ ||j¡|dur6ˆ ||j¡dSr)rr¿r“Úst_uidÚst_gid)r+ràráÚs©r°ryrrÚ check_chownns  z(TestMisc.test_chown..check_chown)rár)NN)rvr[r«r1rrÓr„rÚ LookupErrorrôrÚgetuidÚgetgidrÜrÝrÚrÛÚKeyError)ryrðràrárrrØrrrÚ test_chownUsR   ( , , * ,           zTestMisc.test_chownN) r{r|r}rærçrZr„rrÙrr rrrrr Ds ÿ r c@sèeZdZdd„Zdd„Zdd„Zdd„Zd d „Ze  e e d ƒoHe   ¡d kd ¡dd„ƒZ dd„Zdd„Ze ejdkd¡dd„ƒZdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Ze ejdkd$¡d%d&„ƒZe ejdkd$¡d'd(„ƒZd)S)*Ú TestWhichcCst|jdd|_tj|jddd|_t |jjtj ¡|  |jj ¡tj   |jj¡\|_|_|j|_tj|_d|_dS)NZTmp)ruz.Exe©rWruÚsuffixz.EXE)rvÚtemp_dirr[r\Ú temp_filerrÃrRr¿ÚS_IXUSRrwrÜr+rqrWÚfileÚenv_pathÚcurdirÚextrþrrrÚsetUp–sþzTestWhich.setUpcCs&tj|j|jd}| ||jj¡dS©Nr÷)r„r r'rWr“r%rR©ryrArrrÚ test_basic¤szTestWhich.test_basiccCs(tj|jj|jd}| ||jj¡dSr,)r„r r%rRr$r“r-rrrÚtest_absolute_cmd©szTestWhich.test_absolute_cmdcCs´tj |j¡\}}tj ||j¡}tj|d,tj ||j d}|  ||¡Wdƒn1s`0Ytj|jd(tj ||d}|  |¡Wdƒn1s¦0YdSr,) rr+rqrWr,r'rr¡r„r r$r“Ú assertIsNone)ryrEÚtail_dirÚrelpathrArrrÚtest_relative_cmd¯s*zTestWhich.test_relative_cmdcCs€tj |j¡}tj|jdPtj|j|d}t j dkrT|  |tj  |j |j¡¡n | |¡Wdƒn1sr0YdS)Nr÷Úwin32)rr+rðrWrr¡r„r r'rlrér“r,r)r0)ryrErArrrÚtest_cwd¼s  zTestWhich.test_cwdr¸rznon-root user requiredcCsRt |jjtj¡t |jjtj¡r.| d¡t j |j |j tjd}|  |¡dS)Nzcan't set the file read-only)r+Úmode)rrÃr%rRr¿rÁÚaccessÚW_OKr/r„r r'rWr0r-rrrÚtest_non_matching_modeÈs  z TestWhich.test_non_matching_modecCsjtj |j¡\}}tj|d8tj|j|d}|  |tj  ||j¡¡Wdƒn1s\0YdSr,) rr+rqrWrr¡r„r r'r“r,)ryrEr1rArrrÚtest_relative_pathÒszTestWhich.test_relative_pathcCstjd|jd}| |¡dS)Nzfoo.exer÷)r„r rWr0r-rrrÚtest_nonexistent_fileØszTestWhich.test_nonexistent_filer4zpathext check is Windows-onlycCs<tj|jdd…|jd}| ||jjdd…|j¡dS)Néüÿÿÿr÷)r„r r'rWr“r%rRr*r-rrrÚtest_pathext_checkingÝszTestWhich.test_pathext_checkingcCsRt ¡6}|j|d<t |j¡}| ||jj¡Wdƒn1sD0YdS©NÚPATH) rÚEnvironmentVarGuardr(r„r r'r“r%rR©ryÚenvrArrrÚtest_environ_pathås   zTestWhich.test_environ_pathc CsÚt ¡¾}d|d<tjjd|jdd‚t td|j¡Rt |j¡&t   |j ¡}|  |¡Wdƒn1sr0YWdƒn1s0YWdƒn1s®0YWdƒn1sÌ0YdS)Nrªr?ú os.confstrT©Ú return_valueÚcreateÚdefpath) rr@rærGrHrWÚ swap_attrrr¡r„r r'r0rArrrÚtest_environ_path_emptyës  ÿþ ý z!TestWhich.test_environ_path_emptyc Cs:tj |jj¡}tjdkrBtj}t|t ƒr4t  |¡}tj  ||¡}t   ¡Ú}tj|d<tjjd|jddšt  td|j¡jt |j¡}| |¡t  |j¡(t |j¡}| ||¡Wdƒn1sÎ0YWdƒn1sì0YWdƒn1s 0YWdƒn1s,0YdS)Nr4r?rDTrErH)rr+r r%rRrlrér)r)rƒrr,rr@ÚpathseprærGrHrWrIr„r r'r0r¡r“)ryZ expected_cwdr)rBrArrrÚtest_environ_path_cwdös$      ÿþ   zTestWhich.test_environ_path_cwdc Cs8t ¡}| dd¡tjjdtddLt td|j ¡t   |j ¡}Wdƒn1s^0YWdƒn1s|0Y|  ||jj¡tjjd|j ddJt tdd¡t   |j ¡}Wdƒn1sÜ0YWdƒn1sú0Y|  ||jj¡Wdƒn1s*0YdS)Nr?rDT)r#rGrHrErª)rr@ÚpoprærGrHrÓrIrrWr„r r'r“r%rRrArrrÚtest_environ_path_missing s    ÿþH ÿ þHz#TestWhich.test_environ_path_missingc CsŒtj |j¡}tj|jd\t ¡4}|j|d<tj |j dd}|  |¡Wdƒn1s`0YWdƒn1s~0YdS)Nr÷r?rª) rr+rðrWrr¡r@r(r„r r'r0)ryrErBrArrrÚtest_empty_pathsÿ zTestWhich.test_empty_pathcCsNt ¡2}| dd¡t |j¡}| |¡Wdƒn1s@0YdSr>)rr@rMr„r r'r0rArrrÚtest_empty_path_no_PATH&s   z!TestWhich.test_empty_path_no_PATHztest specific to WindowscCs¢d}tj|jd|d}t |jtj¡| |j ¡tj   |j¡}tj   |¡d}t  ¡6}||d<tj||jd}| ||j¡Wdƒn1s”0YdS)Nú.xyzÚTmp2r"rÚPATHEXTr÷)r[r\r$rrÃrRr¿r&rwrÜr+r rrr@r„r r“©ryr*Z temp_filexyzZprogramrBrArrrÚ test_pathext,sÿ  zTestWhich.test_pathextcCs˜d}tj|jd|d}| |j¡tj |j¡}tj  |¡d}t   ¡<}|›d|d<t j ||jd}| ||j¡Wdƒn1sŠ0YdS)NrQrRr"rú;rSr÷)r[r\r$rwrÜrr+r rRrrr@r„r r“rTrrrÚtest_pathext_with_empty_str>sÿ  z%TestWhich.test_pathext_with_empty_strN)r{r|r}r+r.r/r3r5rærèrZrr¸r9r:r;rçrlrér=rCrJrLrNrOrPrUrWrrrrr!”s2  ÿ  ÿ   r!c@seZdZdd„ZdS)ÚTestWhichBytescCsXt |¡t |j¡|_t |j¡|_t |jj¡|j_t |j¡|_t |j ¡|_ dSr) r!r+rrrWr'r%rRr)r*rþrrrr+Ps  zTestWhichBytes.setUpN)r{r|r}r+rrrrrXOsrXc@sˆeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z e dd„ƒZ e dd„ƒZ dd„Z e dd„ƒZdd„Ze dd„ƒZdd„Ze ejjd¡dd„ƒZd d!„Zd"d#„Zd$d%„Zd&d'„Zeje d(d)„ƒƒZeje d*d+„ƒƒZeje d,d-„ƒƒZ eje d.d/„ƒƒZ!d0d1„Z"d2d3„Z#e d4d5„ƒZ$e d6d7„ƒZ%d8d9„Z&e e'ed:ƒove (¡d;kove'ed<ƒove'e)d=ƒove'e)d>ƒd?¡d@dA„ƒZ*dBS)CÚTestMovecCsvd}| ¡|_| ¡|_tj |j|¡|_tj |j|¡|_t|jdƒ}|  d¡Wdƒn1sh0YdS)Nrr'r) rvrôrõrr+r,r•r”r-r.)ryr°rDrrrr+[s  zTestMove.setUpcCsŽt|dƒ}| ¡}Wdƒn1s(0Yt ||¡t|dƒ }| || ¡¡Wdƒn1sn0Y| tj |¡¡dS©NrF) r-rHr„Úmover“r rr+r‘)ryrbrcÚreal_dstrDÚcontentsrrrÚ_check_move_fileds  &  .zTestMove._check_move_filecCsFtt |¡ƒ}t ||¡| |tt |¡ƒ¡| tj |¡¡dSr) rKrrLr„r[r“r r+r‘)ryrbrcr\r]rrrÚ_check_move_dirls zTestMove._check_move_dircCs| |j|j|j¡dSr)r^r•r”rþrrrÚtest_move_filerszTestMove.test_move_filecCs| |j|j|j¡dSr)r^r•rõr”rþrrrÚtest_move_file_to_dirvszTestMove.test_move_file_to_dircCs"t |j¡}| ||j|j¡dSr)rrr•r^rõr”)ryrbrrrÚ"test_move_file_to_dir_pathlike_srczs z+TestMove.test_move_file_to_dir_pathlike_srccCs"t |j¡}| |j||j¡dSr)rrrõr^r•r”©ryrcrrrÚ"test_move_file_to_dir_pathlike_dsts z+TestMove.test_move_file_to_dir_pathlike_dstcCs | ¡dSr)r`rþrrrÚtest_move_file_other_fs„sz TestMove.test_move_file_other_fscCs | ¡dSr)rarþrrrÚtest_move_file_to_dir_other_fs‰sz'TestMove.test_move_file_to_dir_other_fsc Cs@tj| ¡d}z| |j||¡Wt |¡n t |¡0dSrÚ)r[r«rvr_rôrrx©ryrõrrrÚ test_move_dirŽszTestMove.test_move_dircCs | ¡dSr)rhrþrrrÚtest_move_dir_other_fs–szTestMove.test_move_dir_other_fsc Cs,| |j|jtj |jtj |j¡¡¡dSr)r_rôrõrr+r,r rþrrrÚtest_move_dir_to_dir›s ÿzTestMove.test_move_dir_to_dircCs | ¡dSr)rjrþrrrÚtest_move_dir_to_dir_other_fs sz&TestMove.test_move_dir_to_dir_other_fsc Cs4| |jtjj|jtj |jtj |j¡¡¡dSr)r_rôrr+Úseprõr,r rþrrrÚtest_move_dir_sep_to_dir¥sÿz!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc Cs4| |jtjj|jtj |jtj |j¡¡¡dSr)r_rôrr+Úaltseprõr,r rþrrrÚtest_move_dir_altsep_to_dir©sÿz$TestMove.test_move_dir_altsep_to_dircCsHt|jdƒWdƒn1s"0Y| tjtj|j|j¡dS)Nr')r-r”rr„rr[r•rõrþrrrÚ"test_existing_file_inside_dest_dir®sz+TestMove.test_existing_file_inside_dest_dircCs*tj |jd¡}| tjtj|j|¡dS©NrJ)rr+r,rôrr„rr[rcrrrÚtest_dont_move_dir_in_itself´sz%TestMove.test_dont_move_dir_in_itselfc Csrt t¡zVdD]B\}}tj t|¡}tj t|¡}|jt ||¡d||fdqWt  t¡n t  t¡0dS)N))Úsrcdirz srcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)©rÑ) rr€rr+r,rr„Ú _destinsrcrrxrârrrÚtest_destinsrc_false_negative¹s  ÿÿ z&TestMove.test_destinsrc_false_negativec Csrt t¡zVdD]B\}}tj t|¡}tj t|¡}|jt ||¡d||fdqWt  t¡n t  t¡0dS)N))rszsrc/dest)rsz srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)rt) rr€rr+r,r r„rurrxrârrrÚtest_destinsrc_false_positiveÅs  ÿÿ z&TestMove.test_destinsrc_false_positivecCs\tj |jd¡}t |j|¡t ||j¡|  tj  |j¡¡|  tj  |j|j¡¡dSrq) rr+r,rôrŽr•r„r[r”rrNÚsamefilercrrrÚtest_move_file_symlinkÑs zTestMove.test_move_file_symlinkcCsld}tj |j|¡}t |j|¡t ||j¡tj |j|¡}|  tj  |¡¡|  tj  |j|¡¡dSrq) rr+r,rôrŽr•r„r[rõrrNrx)ryr°rcZ final_linkrrrÚtest_move_file_symlink_to_dirÚsz&TestMove.test_move_file_symlink_to_dircCsztj |jd¡}tj |jd¡}t ||¡tj |jd¡}t ||¡| tj  |¡¡|  tj  |¡tj  |¡¡dS©NrKrJrL) rr+r,rôrŽrõr„r[rrNr“Úrealpath©ryrbrcr rrrÚtest_move_dangling_symlinkås  z#TestMove.test_move_dangling_symlinkcCs|tj |jd¡}tj |jd¡}t |¡t ||¡tj |jd¡}t ||¡|  tj  |¡¡|  tj  ||¡¡dSr{) rr+r,rôr€rŽrõr„r[rrNrxr}rrrÚtest_move_dir_symlinkðs   zTestMove.test_move_dir_symlinkc Cs6t |j|j¡}| |tj |jtj |j¡¡¡dSr) r„r[r•rõr“rr+r,r r-rrrÚtest_move_return_valueüsÿzTestMove.test_move_return_valuecCs6t |jtj |jd¡¡}| |tj |jd¡¡dSrq)r„r[r•rr+r,rõr“r-rrrÚ test_move_as_rename_return_valuesz)TestMove.test_move_as_rename_return_valuecs8g‰‡fdd„}tj|j|j|d| tˆƒd¡dS)Ncsˆ ||f¡dSrrˆr5©Zmovedrrr7sz7TestMove.test_move_file_special_function.._copyr)ri)r„r[r•rõr“r”©ryr7rr‚rÚtest_move_file_special_functions z(TestMove.test_move_file_special_functioncsdg‰‡fdd„}t tj |jd¡¡t tj |jd¡¡tj|j|j|d|  t ˆƒd¡dS)Ncsˆ ||f¡dSrrˆr5r‚rrr7sz6TestMove.test_move_dir_special_function.._copyÚchildZchild1r)r) rr¾rr+r,rôr„r[rõr“r”rƒrr‚rÚtest_move_dir_special_function s  z'TestMove.test_move_dir_special_functionc Cs~| ¡|_tj tj |j¡tj |j¡ ¡¡}| |j|¡z.t   |j|¡|  tj  |¡¡Wt  |¡n t  |¡0dSr)rvrôrr+r,rðr ÚupperrNr„r[rrMr²rgrrrÚtest_move_dir_caseinsensitives  þz&TestMove.test_move_dir_caseinsensitiver¸rrýÚ SF_IMMUTABLEÚ UF_OPAQUErc Cs0zÜt t¡t ttj¡| ttj tt ¡|  t t  ¡v¡t ttj ¡t tj td¡¡t ttj¡| ttj tt ¡|  t t  ¡v¡Wtj t¡r¸t ttj ¡t t¡tj t ¡rÜt t tj ¡t t ¡nNtj t¡rt ttj ¡t t¡tj t ¡r*t t tj ¡t t ¡0dS)Nr…)rr€Ú TESTFN_SRCrýr¿r‰rr"r„r[Ú TESTFN_DSTr rLrŠZ os_helperr¾r+r,r‘rxrþrrrÚtest_move_dir_permission_denied(s,     û z(TestMove.test_move_dir_permission_deniedN)+r{r|r}r+r^r_r`rarbrdr&rerfrhrirjrkrmrærçrr+rnrorprrrvrwrråryrzr~rr€rr„r†rˆrZr¸r¿rrrrrrYYsh              ÿþürYc@s`eZdZGdd„deƒZdd„Ze ed¡dd„ƒZ e ed¡dd „ƒZ e ed¡d d „ƒZ d S) Ú TestCopyFilec@s:eZdZdZdZdZd dd„Zdd„Zdd „Zd d „Z dS) zTestCopyFile.FauxFNTcCs||_||_dSr)Ú_raise_in_exitÚ_suppress_at_exit)ryZ raise_in_exitZsuppress_at_exitrrrÚ__init__QszTestCopyFile.Faux.__init__cGsdS)Nrªr)ryrrrrrHTszTestCopyFile.Faux.readcCs d|_dS)NT)Ú_enteredrþrrrÚ __enter__VszTestCopyFile.Faux.__enter__cCs&|||f|_|jr d|_tdƒ‚|jS)NTú Cannot close)Ú _exited_withrÚ_raisedrr)ryÚexc_typeÚexc_valÚexc_tbrrrÚ__exit__Xs  zTestCopyFile.Faux.__exit__)FT) r{r|r}r’r•r–r‘rHr“ršrrrrÚFauxMs r›c Csrddd„}t td|¡F| t¡t dd¡Wdƒn1sF0YWdƒn1sd0YdS)NrGcSs|dkrtdƒ‚dsJ‚dS)NÚsrcfilezCannot open "srcfile"rrl©r°r6rrrÚ_open`sz4TestCopyFile.test_w_source_open_fails.._openr-rœÚdestfile)rG)rrIr„rrrŒ©ryržrrrÚtest_w_source_open_fails_s  z%TestCopyFile.test_w_source_open_failszskipped on macOScsˆ| ¡‰d ‡fdd„ }t td|¡t dd¡Wdƒn1sF0Y| ˆj¡| ˆjdtu¡|  ˆjdj d ¡dS) NrGcs(|dkr ˆS|dkrtdƒ‚ds$J‚dS)NrœrŸúCannot open "destfile"rrlr©rœrrržms z2TestCopyFile.test_w_dest_open_fails.._openr-rœrŸrri)r¢)rG) r›rrIr„rŒrr’r•rr“rr rr£rÚtest_w_dest_open_failsis* ÿz#TestCopyFile.test_w_dest_open_failscs¬| ¡‰| d¡‰d ‡‡fdd„ }t td|¡t dd¡Wdƒn1sR0Y| ˆj¡| ˆj¡| ˆj¡| ˆjdt u¡|  ˆjd j d ¡dS) NTrGcs$|dkr ˆS|dkrˆSds J‚dS©NrœrŸrrr©rŸrœrrrž€s z3TestCopyFile.test_w_dest_close_fails.._openr-rœrŸrri)r”)rG) r›rrIr„rŒrr’r–r•rr“rr rr¦rÚtest_w_dest_close_fails{s *   ÿz$TestCopyFile.test_w_dest_close_failsc sÎ| d¡‰| ¡‰d ‡‡fdd„ }t td|¡F| t¡t dd¡Wdƒn1s^0YWdƒn1s|0Y| ˆj¡| ˆj¡|  ˆj ¡| ˆj ddu¡| ˆj ¡dS) NTrGcs$|dkr ˆS|dkrˆSds J‚dSr¥rrr¦rrrž–s z5TestCopyFile.test_w_source_close_fails.._openr-rœrŸr)rG) r›rrIr„rrrŒrr’r r–r•r rr¦rÚtest_w_source_close_failss  H   z&TestCopyFile.test_w_source_close_failsN) r{r|r}Úobjectr›r¡rærèÚMACOSr¤r§r¨rrrrrŽKs     rŽc@sxeZdZdZedd„ƒZedd„ƒZdd„Zej dd „ƒZ d d „Z d d „Z dd„Z dd„Ze ejdkd¡dd„ƒZdS)ÚTestCopyFileObji cCstt|jƒdSr)rErÚFILESIZE©ÚclsrrrÚ setUpClassªszTestCopyFileObj.setUpClasscCst t¡t t¡dSr)rr_rr0r­rrrÚ tearDownClass®s zTestCopyFileObj.tearDownClasscCst t¡dSr©rr_r0rþrrrÚtearDown³szTestCopyFileObj.tearDownc csbttdƒD}ttdƒ}||fVWdƒn1s60YWdƒn1sT0YdS©NrFr'©r-rr0rârrrÚ get_files¶s  zTestCopyFileObj.get_filesc Cslt|dƒN}t|dƒ$}| | ¡| ¡¡Wdƒn1s@0YWdƒn1s^0YdSrZ)r-r“rH)ryrbrcÚfsrcÚfdstrrrÚassert_files_eq¼s  zTestCopyFileObj.assert_files_eqcCsH| ¡ \}}t ||¡Wdƒn1s.0Y| tt¡dSr)rµr„Ú copyfileobjr¸rr0rârrrÚ test_contentÁs*zTestCopyFileObj.test_contentcCsP| ¡4\}}t ||¡|jr$J‚|jr.J‚Wdƒn1sB0YdSr)rµr„r¹ÚclosedrârrrÚtest_file_not_closedÆs  z$TestCopyFileObj.test_file_not_closedcCs`| ¡D\}}t ||¡| | ¡|j¡| | ¡|j¡Wdƒn1sR0YdSr)rµr„r¹r“Útellr¬rârrrÚtest_file_offsetÌs z TestCopyFileObj.test_file_offsetrz Windows onlycCs”tj d¡}t tt¡Wdƒn1s.0Y|jsBJ‚| |j ddd¡t j t   ¡dd}| d¡Wdƒn1sŠ0Y|j}| tj|¡tj d¡}t |t¡Wdƒn1sÖ0Y| |j ddd¡t j t   ¡dd}Wdƒn1s 0Y|j}| tj|¡tj d¡}t |t¡Wdƒn1sn0Y|jr„J‚| |t¡dS) Nzshutil._copyfileobj_readintorrYiFrVsfoor)rærGrHr„rŒrr0Úcalledr“Ú call_argsr[r\rr]r.rRrwrr_r¸)ryÚmrDrsrrrÚ test_win_implÒs&* (* , zTestCopyFileObj.test_win_implN)r{r|r}r¬Ú classmethodr¯r°r²Ú contextlibÚcontextmanagerrµr¸rºr¼r¾rærèrrRrÂrrrrr«§s   r«c@s’eZdZdZdZdZdZedd„ƒZedd„ƒZ d d „Z e j d d „ƒZ d d„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„ZdS) Ú_ZeroCopyFileTestz#Tests common to all zero-copy APIs.i r5rªcCsXtt|jƒttdƒ.}| ¡|_t|jƒ|jks6J‚Wdƒn1sJ0YdSrZ)rErr¬r-rHÚFILEDATAr”)r®rDrrrr¯÷s   z_ZeroCopyFileTest.setUpClasscCst t¡dSr)rr_rr­rrrr°þsz_ZeroCopyFileTest.tearDownClasscCst t¡dSrr±rþrrrr² sz_ZeroCopyFileTest.tearDownc csbttdƒD}ttdƒ}||fVWdƒn1s60YWdƒn1sT0YdSr³r´rârrrrµ s  z_ZeroCopyFileTest.get_filescOs tdƒ‚dS)Nzmust be implemented in subclass)ÚNotImplementedError)ryrrrrrÚ zerocopy_fun sz_ZeroCopyFileTest.zerocopy_funcCs$| ¡| ¡| ¡| ¡dSr)r²r°r¯r+rþrrrÚreset sz_ZeroCopyFileTest.resetc CsÀ| ¡ \}}| ||¡Wdƒn1s.0Y| ttdd|j¡| ¡V\}}tj d¡}t   t t¡Wdƒn1sŠ0Y|j ržJ‚Wdƒn1s²0YdS)NT©r/zshutil.copyfileobj) rµrÉr“rIr0rÇrærGrHr„rŒrr¿)ryrbrcrÁrrrÚtest_regular_copy s**z#_ZeroCopyFileTest.test_regular_copyc Csˆ| |j¡| ¡J\}}| t¡| ||¡Wdƒn1sF0YWdƒn1sd0Y| ttdd|j ¡dS)NTrË) rwrÊrµrr×rÉr“rIrrÇrârrrÚtest_same_file s   Hz _ZeroCopyFileTest.test_same_filecCsZtjt ¡d}| t¡}t |d¡Wdƒn1s<0Y| |j j |¡dS)Nr§Únew) r[r«rr]rr¬r„rŒr“r¯r°)ryrRr´rrrÚtest_non_existent_src( s *z'_ZeroCopyFileTest.test_non_existent_srcc sÖtd‰td‰| ‡fdd„¡| ‡fdd„¡tˆdƒWdƒn1sT0YtˆdƒF}tˆdƒ}| ||¡Wdƒn1s–0YWdƒn1s´0Y| tˆdd d ¡dS) Nrbrccs t ˆ¡Sr©rr_r)r`rrrñ1 r5z3_ZeroCopyFileTest.test_empty_file..cs t ˆ¡SrrÐr)rarrrñ2 r5r'rFTrËr5)rrwr-rÉr“rIrâr)rar`rÚtest_empty_file. s   Hz!_ZeroCopyFileTest.test_empty_filecCsHtjj|jtd"| ttjtt ¡Wdƒn1s:0YdS)N©r#) rærGrHÚ PATCHPOINTÚZeroDivisionErrorrr„rŒrr0rþrrrÚtest_unhandled_exception< s  ÿÿz*_ZeroCopyFileTest.test_unhandled_exceptionc Cs tjj|jttjdƒdr| ¡J\}}| t ¡|  ||¡Wdƒn1sV0YWdƒn1st0YWdƒn1s’0YdS©NÚyorÒ) rærGrHrÓrrÚEINVALrµrr rÉrârrrÚtest_exception_on_first_callB s   ÿ z._ZeroCopyFileTest.test_exception_on_first_callc Cs|tjj|jttjdƒdN| ¡&\}}| t|j ||¡Wdƒn1sP0YWdƒn1sn0YdSrÖ) rærGrHrÓrrÚENOSPCrµrrÉrârrrÚtest_filesystem_fullL s   ÿz&_ZeroCopyFileTest.test_filesystem_fullN)r{r|r}Ú__doc__r¬rÇrÓrÃr¯r°r²rÄrÅrµrÉrÊrÌrÍrÏrÑrÕrÙrÛrrrrrÆñs(     rÆzos.sendfile() not supportedc@sXeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dS)ÚTestZeroCopySendfileú os.sendfilecCs t ||¡Sr)r„Ú_fastcopy_sendfile)ryr¶r·rrrrÉY sz!TestZeroCopySendfile.zerocopy_func Cs²t |j¡|}ttdƒR}| t¡| ||¡Wdƒn1sF0Yt  ||¡Wdƒn1sp0YWdƒn1sŽ0Y|  t tdd|j¡dS)Nr'TrË) ÚioÚBytesIOrÇr-r0rr rÉr„r¹r“rIrârrrÚtest_non_regular_file_src\ s   *Hz.TestZeroCopySendfile.test_non_regular_file_srcc Cs´ttdƒ–}t ¡n}| t¡| ||¡Wdƒn1sB0Yt ||¡|  d¡|  |  ¡|j ¡Wdƒn1sˆ0YWdƒn1s¦0YdS)NrFr) r-rràrárr rÉr„r¹Úseekr“rHrÇrârrrÚtest_non_regular_file_dste s   *  z.TestZeroCopySendfile.test_non_regular_file_dstc sʇ‡fdd„}g‰tj‰tjjdd|dr| ¡J\}}| t¡}t  ||¡Wdƒn1sf0YWdƒn1s„0YWdƒn1s¢0Yˆs´J‚|  |j j t j ¡dS)Ncs,ˆsˆ d¡ˆ|i|¤ŽSttjdƒ‚dS)Nr×)rOrrÚEBADFr©r'Z orig_sendfilerrrUo s zDTestZeroCopySendfile.test_exception_on_second_call..sendfilerÞT)rGr#)rrUrærGrHrµrrr„rßr“r¯rrå)ryrUrbrcr´rrærÚtest_exception_on_second_calln s ÿ fz2TestZeroCopySendfile.test_exception_on_second_callc CsŒtjjdtdR}| ¡*\}}t ||¡|js6J‚Wdƒn1sJ0YWdƒn1sh0Y| t t dd|j ¡dS)Núos.fstatrÒTrË) rærGrHrrµr„rßr¿r“rIr0rÇ©ryrÁrbrcrrrÚtest_cant_get_size€ s  Fz'TestZeroCopySendfile.test_cant_get_sizec Csœtj ¡}d|_tjjd|dR}| ¡*\}}t ||¡|jsFJ‚Wdƒn1sZ0YWdƒn1sx0Y|  t t dd|j ¡dS)Nirè©rFTrË) rærGÚMockÚst_sizerHrµr„rßr¿r“rIr0rÇ©ryrGrÁrbrcrrrÚtest_small_chunksŠ s  Fz&TestZeroCopySendfile.test_small_chunksc Cs¢tj ¡}|jd|_tjjd|dR}| ¡*\}}t ||¡|j sLJ‚Wdƒn1s`0YWdƒn1s~0Y|  t t dd|j ¡dS)Ni@rèrëTrË)rærGrìr¬rírHrµr„rßr¿r“rIr0rÇrîrrrÚtest_big_chunk— s   Fz#TestZeroCopySendfile.test_big_chunkcCsÂtjjdtdž}| ttjtt¡|j dd}|  |t j   t¡¡t t¡ttddd| tjtd¡| ttjttd¡|j dd}|  |d ¡Wdƒn1s´0YdS) NrÞrÒrrshelloTrËÚ3i€)rærGrHrÔrr„rŒrr0rÀr“rr+r@rr_r1rw)ryrÁÚ blocksizerrrÚtest_blocksize_arg¤ s"ÿÿ  ÿz'TestZeroCopySendfile.test_blocksize_argc Cstjs J‚zþtjj|jttjdƒd|}|  ¡J\}}|  t ¡t  ||¡Wdƒn1sb0YWdƒn1s€0Y|j s”J‚Wdƒn1s¨0Ytjr¼J‚tj |j¡&}t tt¡|j râJ‚Wdƒn1sö0YWdt_ndt_0dS)Nr×rÒT)r„Ú_USE_CP_SENDFILErærGrHrÓrrÚENOTSOCKrµrr rßr¿rŒrr0rérrrÚtest_file2file_not_supported¶ s   þ H(  *z1TestZeroCopySendfile.test_file2file_not_supportedN) r{r|r}rÓrÉrârärçrêrïrðrórörrrrrÝU s     rÝz macOS onlyc@seZdZdZdd„ZdS)ÚTestZeroCopyMACOSzposix._fcopyfilecCst ||tj¡Sr)r„Ú_fastcopy_fcopyfileÚposixÚ_COPYFILE_DATArârrrrÉÐ szTestZeroCopyMACOS.zerocopy_funN)r{r|r}rÓrÉrrrrr÷Ì sr÷c@s^eZdZdd„Zdd„Zdd„Ze e  e j   ¡¡d¡e e edƒd ¡d d „ƒƒZd d „ZdS)ÚTestGetTerminalSizecCs(t ¡}| |jd¡| |jd¡dS)zÔCheck 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)r„Úget_terminal_sizerÚcolumnsÚlines)ryrArrrÚtest_does_not_crashÕ sz'TestGetTerminalSize.test_does_not_crashcCsœt ¡&}d|d<|d=t ¡}Wdƒn1s40Y| |jd¡t ¡&}|d=d|d<t ¡}Wdƒn1s€0Y| |jd¡dS)z.Check if environment variables have precedenceZ777ÚCOLUMNSÚLINESNi Z888ix)rr@r„rür“rýrþ©ryrBrArrrÚtest_os_environ_firstß s & &z)TestGetTerminalSize.test_os_environ_firstcCs`t ¡(}d|d<d|d<t ¡}Wdƒn1s60Y| |jd¡| |jd¡dS)NrfrZyyyrr)rr@r„rürrýrþrrrrÚtest_bad_environî s  &z$TestGetTerminalSize.test_bad_environz not on ttyrüzneed os.get_terminal_size()c Cs¤zt ddg¡ ¡ ¡}Wn$tttjfy>| d¡Yn0t|dƒt|dƒf}t   ¡$}|d=|d=t   ¡}Wdƒn1sŠ0Y|  ||¡dS) zíCheck 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 failedrirrrN)rnrËrÏrqr¬r"rÍr/rrrr@r„rür“)ryrArürBrörrrÚtest_stty_matchö s ÿ  &z#TestGetTerminalSize.test_stty_matchc Cst ¡ô}|d=|d=t tdd¡tjdd}Wdƒn1sF0Y| |jd¡| |jd¡t t j dƒJ}t td|¡tjd d}Wdƒn1sª0YWdƒn1sÈ0Y| |jd ¡| |jd ¡Wdƒn1s0YdS) NrrÚ __stdout__)é é)Úfallbackrrr()éé(r r ) rr@rIrlr„rür“rýrþr-rÚdevnull)ryrBrArDrrrÚ test_fallback s * ÿHz!TestGetTerminalSize.test_fallbackN)r{r|r}rÿrrrærçrÚisattyrlrr^rZrr rrrrrûÔ s  ÿ rûc@seZdZdZdd„ZdS)ÚPublicAPITestsz>Ensures that the correct values are exposed in the public API.cCsP| ttdƒ¡gd¢}ttdƒs,tjdkr6| d¡| ttjƒt|ƒ¡dS)NÚ__all__)r¹rŒrOr\r„r‡rñr[rxrr‘Ú ExecErrorrrrrr rr rrrr rür Ústatvfsrr) rrZr„rrRrOr“rr)ryZ target_apirrrÚtest_module_all_attribute% s  z(PublicAPITests.test_module_all_attributeN)r{r|r}rÜrrrrrr" srÚ__main__)F)F)NræZ unittest.mockr„r[rlr¿rZos.pathrr$rrnr6r8rÄràrrrrrrrr r r r r r£rÀrùÚ ImportErrorrêrZ test.supportrrr0r‹rŒrérrªrkrÚrÜrÙr£rr&r1rErIrPrfZSUPPORTS_SENDFILErsrtZTestCaser~rêrIr˜r r!rXrYrŽr«r©rÆrèrÝr÷rûrr{ÚmainrrrrÚsž8              [PgP< s\Jd v N